一、基础用法
1. XML 布局配置
RadioGroup
作为容器管理多个 RadioButton
,确保同一时间仅一个选项被选中。
示例代码:
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"> <!-- 垂直排列 -->
<RadioButton
android:id="@+id/radioOption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选项1"
android:checked="true" /> <!-- 默认选中 -->
<RadioButton
android:id="@+id/radioOption2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选项2" />
</RadioGroup>
-
关键属性:
-
android:orientation
:控制选项排列方向(vertical
或horizontal
)。 -
android:checked
:设置默认选中项(同一组内仅一个可设为true
)。
-
2. 事件监听
通过 OnCheckedChangeListener
监听选项变化:
RadioGroup radioGroup = findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
switch (checkedId) {
case R.id.radioOption1:
// 选项1被选中
break;
case R.id.radioOption2:
// 选项2被选中
break;
}
// 获取选中项的文本
RadioButton selectedBtn = findViewById(checkedId);
String selectedText = selectedBtn.getText().toString();
});
-
参数说明:
-
checkedId
:当前选中的RadioButton
的 ID。
-
二、高级功能
1. 动态添加 RadioButton
RadioGroup radioGroup = findViewById(R.id.radioGroup);
for (int i = 0; i < 3; i++) {
RadioButton rb = new RadioButton(this);
rb.setText("动态选项 " + (i+1));
rb.setId(View.generateViewId()); // 生成唯一ID
radioGroup.addView(rb);
}
2. 自定义样式
修改选中/未选中状态的图标:
-
创建选择器(
res/drawable/custom_radio.xml
):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/radio_checked" android:state_checked="true" />
<item android:drawable="@drawable/radio_unchecked" />
</selector>
-
应用至 RadioButton:
<RadioButton
...
android:button="@drawable/custom_radio" />
3. 多组 RadioGroup 独立使用
<RadioGroup android:id="@+id/group1"> ... </RadioGroup>
<RadioGroup android:id="@+id/group2"> ... </RadioGroup>
-
每组独立互斥,用户可在不同组中各选一个选项。
三、RadioGroup 与 RadioButton 的区别
特性 |
RadioGroup |
RadioButton |
---|---|---|
角色 |
容器(管理互斥逻辑) |
选项控件(显示具体选项) |
继承关系 |
|
|
核心方法 |
|
|
是否可独立实现单选 |
❌ 需包含多个 RadioButton |
❌ 单独使用无法互斥 |
四、常见问题解决
-
默认选中无效
-
确保同一
RadioGroup
中仅一个RadioButton
设置android:checked="true"
。 -
或通过代码设置:
-
radioGroup.check(R.id.radioOption1); // 动态设置默认选中
-
事件多次触发
-
避免在监听器中执行耗时操作,防止阻塞主线程。
-
-
动态添加选项后事件不触发
-
确保为动态生成的
RadioButton
设置唯一 ID(View.generateViewId()
)。
-
五、最佳实践
-
布局优化:
-
优先使用
ConstraintLayout
嵌套RadioGroup
,避免多层嵌套导致的性能问题。
-
-
代码规范:
-
使用 Kotlin 扩展函数简化事件监听:
-
fun RadioGroup.onSelection(block: (id: Int) -> Unit) {
setOnCheckedChangeListener { _, id -> block(id) }
}
// 调用
radioGroup.onSelection { id -> ... }
-
无障碍支持:
-
为
RadioGroup
设置android:contentDescription
,辅助屏幕阅读器识别。
-
总结:
-
基础场景:静态选项 → XML 布局 +
OnCheckedChangeListener
。 -
动态场景:数据驱动选项 → 动态添加
RadioButton
+ 唯一 ID 管理。 -
样式定制:通过 Selector 替换图标,适配应用主题。
避免常见错误(如多默认选中)并合理设计布局,可高效实现单选功能