RadioGroup:如何以编程方式检查

72

我从XML创建了一个RadioGroup。

    <RadioGroup android:id="@+id/option" 
        android:layout_width="match_parent"
        android:orientation="horizontal" 
        android:checkedButton="@+id/block_scenario_off"
        android:layout_height="wrap_content">
        <RadioButton 
            android:layout_width="0dip"
            android:layout_weight="1" 
            android:text="@string/option1" 
            android:layout_height="wrap_content" 
            android:id="@+id/option1"
            android:layout_gravity="center|left" 
            android:onClick="@string/on_click"/>
        <RadioButton 
            android:layout_width="0dip"
            android:layout_weight="1" 
            android:text="@string/option2" 
            android:onClick="@string/on_click"
            android:layout_height="wrap_content"
            android:layout_gravity="center" 
            android:id="@+id/option2"/>
        <RadioButton 
            android:layout_width="0dip"
            android:layout_weight="1" 
            android:text="@string/option3"
            android:onClick="@string/on_click" 
            android:layout_height="wrap_content"
            android:layout_gravity="center|right" 
            android:id="@+id/option3" />
    </RadioGroup>
在Java代码中,我在Activity创建时(onCreate())以以下方式编程来程序化地检查第一个:
    mOption = (RadioGroup) findViewById(R.id.option);
    mOption.check(R.id.option1);

但是当活动被显示时,没有单选按钮被选中。有什么帮助吗?


2
如果您想以编程方式检查单选按钮,则不应接受该答案,因为这是我们在XML文件中设置它们的选中状态的方法! - arniotaki
12个回答

87

在布局中,您可以将 android:checked="true" 添加到您想要选中的 CheckBox

或者以编程方式,您可以使用可检查接口中定义的setChecked方法:

RadioButton b =(RadioButton)findViewById(R.id.option1); b.setChecked(true);


7
是的,它适用于在XML中分配了checked属性的RadioButton,但在Java代码中(即mOption.check(R.id.option1);),它不起作用。 - Bao Le
2
由于我在同一布局中有两个RadioGroup,代码无法正常工作。如果我删除一个,另一个就可以正常工作。我仍然在处理同一布局中两个或更多的RadioGroup的问题。谢谢。 - Bao Le
1
这个答案是错误和危险的。设置单选按钮选中不会修改RadioGroup的状态。Bao Le自己解释了为什么他无法使其工作:他在xml中重复使用了相同的id。 - AndrewBloom
1
@Blackbelt,你看到了单选按钮集(在调用setChecked之后),但是RadioGroup的状态没有改变。这可能会导致微妙的错误,即你在视觉上看到一个单选按钮被设置,但是查询RadioGroup的状态时,你得到的是另一个单选按钮集的ID。 - AndrewBloom
1
@AndrewBloom,这不是一个微妙的错误。根据RadioGroup文档,这是预期的行为。 - Blackbelt
显示剩余8条评论

41

如果你想根据某个变量(比如“genderStr”)的值来检查单选按钮,则可以尝试以下代码片段:

    if(genderStr.equals("Male"))
       genderRG.check(R.id.maleRB);
    else 
       genderRG.check(R.id.femaleRB);

32

在处理单选按钮组的索引时,我使用这段代码:

radioGroup.check(radioGroup.getChildAt(index).getId());

4
最佳答案。简明扼要易懂。只需要一个对象。可以轻松地添加到方法中。 - seekingStillness
3
应将此置于顶部。其他的过于复杂。 - Mangaldeep Pannu

30

注意!使用setChecked()选中单选按钮不会改变RadioGroup中的状态。例如,从radioGroup调用此方法将返回错误结果:getCheckedRadioButtonId()

始终使用以下方法检查radioGroup:

mOption.check(R.id.option1);

你已经被警告了 ;)


27

你可能需要在代码的onCreate方法中声明并使用单选按钮。

RadioButton rb1 = (RadioButton) findViewById(R.id.option1);
rb1.setChecked(true);

1
这对我不起作用,也不行mOption.check(R.id.option1)。 我已经尝试了在onCreate()和onResume()中。出了什么问题? - Rodrigo

14

你也可以使用getChildAt()方法。像这样:

mOption = (RadioGroup) findViewById(R.id.option);
((RadioButton)mOption.getChildAt(0)).setChecked(true);

13

当我使用getId()处理单选按钮组时,我会使用这段代码:

radiogroup.check(radiogroup.getChildAt(0).getId());

根据您的RadioGroup设计设置位置。

希望这能帮到您!


13

获取单选框组,并查看其子元素以查看是否有任何未被选中。

RadioGroup rg = (RadioGroup) view;
int checked = savedInstanceState.getInt(wrap.getAttributeName());

if(checked != -1) {
    RadioButton btn = (RadioButton) rg.getChildAt(checked);
    btn.toggle();
}

我认为“checked”必须大于-1而不是不等于-1。 - technik

8

如果您把 mOption.check(R.id.option1); 放入 onAttachedToWindow 方法或者像下面这样,它就能够工作:

view.post(new Runnable()
{
    public void run() 
    {
        // TODO Auto-generated method stub
        mOption.check(R.id.option1); 
    }
});

可能的原因是在实际渲染单选按钮组之前,检查方法并不能起作用。

David在他的回答中提到,直到radiogroup实际渲染出来,check方法才能起作用,这个评论解决了我一个谜团。 - Alyoshak

5
在Kotlin中,选择第一个元素。并且你需要在onViewCreated或之后执行此操作。
radioGroup.apply { check(getChildAt(0).id) }

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