RadioGroup可以跨多个布局吗?

时间:2012-01-30 18:42:55

标签: android

我之前在xml中成功制作并使用了RadioGroup,但每次连续都有一组单选按钮,都在同一个LinearLayout中。现在我希望将一组单选按钮定义为组的一部分,但它们不在同一布局中。我的小组的开始和结束代码是:

START:

<RadioGroup    android:id="@+id/radioGroup1" >

END:

</RadioGroup>

如果我将它单独放在每个按钮周围,那么它会编译,但按钮不会作为单选按钮(即激活一个按钮不会取消激活其他按钮)。如果我尝试在任何按钮之前放置“start”并将“end”放在最后一个按钮之后,那么我会收到编译错误。

4 个答案:

答案 0 :(得分:3)

将RadioButtons存储在一个数组中。您必须自己启用/禁用它们,而不是将它们分组到RadioGroup中。 (未经测试,因此没有复制/粘贴)

声明这些变量

private ArrayList<RadioButton> mGroup = new ArrayList<RadioGroup>();
private CompoundButton.OnCheckedChangeListener mListener = new CompoundButton.OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        for(RadioButton btn : mGroup)
            btn.setChecked(false);

        buttonView.setChecked(true);
    }
}

您活动的某个地方:

mGroup.add(your radiobuttons);    // e.g. (RadioButton)findViewById(R.id.radio_button1);
mGroup.add(another radiobutton);

for(RadioButton btn : mGroup)
   btn.setOnCheckedChangeListener(mListener)

在检查/取消选中后,可能必须使按钮无效,以便重绘

答案 1 :(得分:2)

不幸的是,SDK并不直接支持这样做,您需要创建一个自定义“组”来管理按钮。

每个RadioButton的所有互斥逻辑都由RadioGroup管理,因此所有按钮都必须添加到同一组中。 RadioGroupLinearLayout的子类,因此这本身意味着它们也需要全部采用相同的布局。 RadioGroup通过遍历其子项来管理每个按钮的已检查状态,这就是两者无法离婚的原因。

Here is a linkRadioGroup源代码为起点,您可以创建一个自定义管理器,在此处使用相同的逻辑来管理检查哪个按钮的状态,以便将它们与它们分开布局状态。 RadioGroup基本上只为每个OnCheckedChangeListener子项注册为RadioButton,然后根据用户事件控制所有按钮的检查状态。

HTH

答案 2 :(得分:1)

这是Entreco代码第一部分的精炼和测试版本:

    final ArrayList<RadioButton> mGroup = new ArrayList<RadioButton>();
    CompoundButton.OnCheckedChangeListener mListener = new CompoundButton.OnCheckedChangeListener() 
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            for(RadioButton btn : mGroup) {
                if (buttonView.getId() != btn.getId() && isChecked) {
                    btn.setChecked(false);
                }
            }
        }
    };

只有当点击按钮的状态从未选中状态更改为选中状态时,才会取消选中其他按钮。

答案 3 :(得分:1)

@Entreco回答可以导致onCheckedChanged的递归调用,这是由@Twilite回答修复的。

但@Twilite的回答也有问题,没有显式id的id视图可能不是唯一的。如果发生这种情况,您可能会看到多个选定的单选按钮,或者没有选中它们。因此,为每个ID设置唯一ID或唯一标记更安全:

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

        if (isChecked) {

            for (RadioButton btn : mGroup)
                if (!btn.getTag().equals(compoundButton.getTag()))
                    btn.setChecked(false);

        }
    }