以编程方式设置单选按钮样式

9

我希望能够在片段中动态创建一些单选按钮,但是我遇到了样式问题。如果我将单选按钮代码放在xml文件中,则应用默认样式可以正确显示,但是当我通过函数创建单选按钮时,我看到不同的样式!

XML

<RadioGroup
            android:id="@+id/radiogroup"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical"
            android:animationCache="false">

            <RadioButton
                android:text="RadioButton 1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/radioButton3" />

            <RadioButton
                android:text="RadioButton 2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/radioButton4" />


</RadioGroup>

结果

在此输入图片描述

JAVA代码

这段代码放在片段的onCreateView中。

public void addRadioButton(Context ctx,int num){

    RadioGroup radioGroup= (RadioGroup) alertInflatedView.findViewById(R.id.radiogroup);

    for (int i = 1; i <= num; i++) {
        RadioButton radioButton  = new RadioButton(ctx);
        radioButton.setId(1+i);
        radioButton.setText("Radio " + radioButton.getId());
        radioButton.setTextColor(getResources().getColor(R.color.black));

        radioGroup.addView(radioButton);

    }

}

结果

enter image description here

如您所见,单选按钮的样式不同,请问是否可以通过编程应用默认样式?


可能是重复问题:如何设置通过编程添加的视图的样式 - jakubbialkowski
4个回答

15

你需要在drawable或style.xml上创建样式,以满足你的需求。

drawable/null_selector.xml

  <?xml version="1.0" encoding="utf-8"?> 
  <selector xmlns:android="http://schemas.android.com/apk/res/android" > 
         <item android:drawable="@android:color/transparent" /> 
  </selector> 

将每个按钮设置为使用它(并将文本居中),如下所示(R.drawable.null_selector 是选择器XML):

现在,在您的 Activity 中,您必须实现此样式。

  RadioButton radioButton = new RadioButton(ctx);
  radioButton.setText(Integer.toString(i));
  radioButton.setGravity(Gravity.CENTER); 
  radioButton.setButtonDrawable(R.drawable.null_selector); 

我认为这将有助于您在单选按钮中实现自定义样式。


6
感谢 Dharma,我按照您的建议更改了一些内容,问题已经解决!
JAVA 代码
public void addRadioButton(Context ctx,int num){

    RadioGroup radioGroup= (RadioGroup) alertInflatedView.findViewById(R.id.radiogroup);
    RadioGroup.LayoutParams layoutParams = new RadioGroup.LayoutParams(
            RadioGroup.LayoutParams.MATCH_PARENT,
            RadioGroup.LayoutParams.WRAP_CONTENT);

    for(int i=0; i<num; i++){

        RadioButton radioButton  = new RadioButton(ctx);
        radioButton.setId(1+i);
        radioButton.setText("Radio"+i);
        radioButton.setTextSize(16);
        radioButton.setTextColor(getResources().getColor(R.color.black));
        radioButton.setButtonDrawable(R.drawable.radio_button_selector);
        radioButton.setPadding(80,0,0,0);
        radioButton.setGravity(Gravity.CENTER_VERTICAL);
        radioButton.setLayoutParams(layoutParams);
        radioGroup.addView(radioButton);

    }

}

带有选中和未选中按钮图像的 XML 单选按钮选择器

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_checked="false" android:drawable="@drawable/unchekedradiobutton" />
<item android:state_checked="true" android:drawable="@drawable/checkedradiobutton" />
<item android:drawable="@drawable/unchekedradiobutton" /> <!-- default -->


5
使用一个Inflater实例来填充自定义布局,轻松获取自定义的单选按钮。
private RadioButton createCustomRadioButton(Context context){
    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(R.layout.radio_button,null);
    RadioButton radioButton  = (RadioButton) v.findViewById(R.id.radio_button);
    radioButton.setText("It Works!");

    ((ViewGroup)radioButton.getParent()).removeView(radioButton);
    return radioButton;
}

radio_buttom.xml

<RadioButton
    android:id="@+id/radio_button"
    style="@style/radio"
    android:background="@drawable/style_line" />

style.xml

<style name="radio">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_marginLeft">30dp</item>
    <item name="android:layout_marginRight">30dp</item>
    <item name="android:layout_marginTop">10dp</item>
    <item name="android:layout_marginBottom">10dp</item>
    <item name="android:padding">10dp</item>
    <item name="android:drawablePadding">5dp</item>
    <item name="android:textColor">@color/whiteColor</item>
    <item name="android:textColorHint">@color/hintColor</item>
    <item name="android:editTextColor">@color/whiteColor</item>
</style>

由Ubirajara(墨西哥)撰写


2

从编程角度来说,我建议在循环中为每个单选按钮设置一个ColorStateList

radioButton.setButtonTintList(getRadioButtonColors());

然后,

private ColorStateList getRadioButtonColors() {
        return new ColorStateList (
                new int[][] {
                        new int[] {android.R.attr.state_checked}, // checked
                        new int[] {android.R.attr.state_enabled} // unchecked
                },
                new int[] {
                        Color.GREEN, // checked
                        Color.BLUE   // unchecked
                }
        );
    }

android.R.attr.state_checked表示选中按钮的颜色(绿色)android.R.attr.state_enabled表示未选中按钮的颜色(蓝色)

个人认为这是更好的解决方案,因为它比在代码库的其他位置创建样式和其他依赖项更加简洁。尽可能使用最简洁和高效的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接