当RadioButtons以编程方式添加时,Android RadioGroup的行为会有所不同

时间:2017-03-22 16:42:57

标签: android radio-group

我正在创建一个定义如下的自定义RadioGroup。

MyRadioGroup.cpp

public class MyRadioGroup
        extends RadioGroup
{
...
    public MyRadioGroup(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        mContext = context;
        init(attrs);
    }

    private void init(AttributeSet attrs)
    {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_radio_group, this);
    }

    public String getSelection()
    {
        View radioButton = findViewById(getCheckedRadioButtonId());
        return radioButton.getTag().toString();
    }
}

my_radio_group.xml 有几个按钮定义如下......

<merge
    xmlns:android="http://schemas.android.com/apk/res/android">

    <RadioButton
        android:id="@+id/rbOne"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:background="@drawable/rb_selection_background"
        android:button="@null"
        android:gravity="center_horizontal"
        android:tag="One"
        android:text="Radio Button 1"
        android:textColor="@color/rptText"
        android:textSize="18sp"/>
...
</merge>

rb_selection_background.xml drawable

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/simple_border"
        android:state_checked="true"/>
</selector>

使用此设置,我得到了我想要的无圆按钮结果,所选按钮显示文本周围的简单边框。

然后我做了一个更改,从字符串数组资源动态生成我的单选按钮。像这样......

private void init(AttributeSet attrs)
{

    Drawable selectionBg = ResourcesCompat.getDrawable(getResources(),
                                              R.drawable.rb_selection_background,
                                                   null);

    String[] rbStrings = getResources().getStringArray(R.array.rb_strings);
    for(int i = 0; i < rbStrings.length; ++i)
    {
        RadioButton rb = new RadioButton(mContext);
        LayoutParams lp = new LayoutParams(0, LayoutParams.WRAP_CONTENT);
        lp.weight = 1;
        rb.setText(rbStrings[i]);
        rb.setTag(rbStrings[i]);
        rb.setTextSize(18);
        rb.setGravity(Gravity.CENTER_HORIZONTAL);
        rb.setButtonDrawable(0);
        rb.setBackground(selectionBg);
        addView(rb, lp);
    }
}

现在无论我点击简单边框的哪个单选按钮总是显示在最后一个单选按钮上。无线电组的状态是正确的,因为当我调用getSelection()时,它会返回所选单选按钮的标记。

回到我的问题,为什么行为不同?有没有办法在以编程方式添加单选按钮时获得所需的行为?感谢。

1 个答案:

答案 0 :(得分:1)

改变

rb.setBackground(selectionBg);

rb.setBackgroundResource(R.drawable.rb_selection_background);

的工作。

我没有解释原因,我需要进一步了解每种方法。