2012-01-30 93 views
1

我已经成功地在xml中创建并使用过RadioGroup,但每次都有一组连续的单选按钮,都在同一个LinearLayout中。现在我想定义一组单选按钮作为组的一部分,但它们的布局不一样。该组我的开始和结束码是:RadioGroup可以跨越多个布局吗?

START:

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

END:

</RadioGroup> 

如果我把这个围绕每个按钮单独,然后再编译,但按键别t充当单选按钮(即激活一个没有关闭其他按钮)。如果我尝试在任何按钮之前放置“开始”,并在最后一个按钮之后放置“结束”,则会出现编译错误。

回答

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) 

也许你选中/取消选中后无效的按钮,来导致重绘

2

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

每个RadioButton的所有互斥逻辑都由RadioGroup管理,因此所有按钮都必须添加到同一组中。 RadioGroupLinearLayout的一个子类,所以这固有意味着它们也需要全部处于相同的布局。 RadioGroup通过迭代其子代来管理每个按钮的检查状态,这就是为什么两个人不能离婚的原因。

Here is a linkRadioGroup源代码为起点,您可以创建一个使用相同的逻辑在这里来管理这些按钮是为了他们自己的配置状况检查分离状态的自定义管理器。 RadioGroup基本上只是为RadioButton的每个孩子注册为OnCheckedChangeListener,然后根据用户事件控制所有按钮的检查状态。

HTH

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); 
       } 
      } 
     } 
    }; 

将取消只有其他按钮和只有在按下按钮的状态从选中变为检查。

1

@Entreco答案可能会导致递归调用onCheckedChanged,由@Twilite答案修复。

但@Twilite答案也有问题,这是没有显式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); 

     } 
    }