Android Material ButtonToggleGroup获取选中按钮ID异常求助
这个问题我之前也碰到过,是Material库1.2.0-alpha06版本的一个已知bug——当同时设置app:singleSelection="true"和app:selectionRequired="true"时,组件内部的选中状态没有被正确同步,导致调用toggleGroup.checkedButtonId会返回错误的-1值,但实际上选中状态是正常的。
下面给你两个可行的解决思路,按需选择:
1. 升级Material库版本(最推荐)
alpha版本本身就存在很多不稳定的问题,这个bug在后续的正式版本(比如1.2.0正式版及以上)已经被修复了。直接在build.gradle里把依赖版本升级:
implementation 'com.google.android.material:material:1.2.0' // 或更高稳定版本
升级后toggleGroup.checkedButtonId就能正常返回选中按钮的ID了,不需要额外写代码处理。
2. 手动维护选中状态(无法升级版本时的替代方案)
如果因为项目限制不能升级库版本,那就通过监听选中事件来手动记录每个ToggleGroup的选中ID:
首先定义一个Map来存储每个ToggleGroup对应的选中按钮ID:
private Map<MaterialButtonToggleGroup, Integer> toggleGroupCheckedIds = new HashMap<>();然后给每个ToggleGroup设置
OnButtonCheckedListener,在回调里更新Map中的状态:// 假设你有两个ToggleGroup:toggleGroup1和toggleGroup2 setupToggleGroupListener(toggleGroup1); setupToggleGroupListener(toggleGroup2); private void setupToggleGroupListener(MaterialButtonToggleGroup toggleGroup) { // 初始化时先手动获取一次选中状态(如果有默认选中的按钮) for (int i = 0; i < toggleGroup.getChildCount(); i++) { View child = toggleGroup.getChildAt(i); if (child instanceof MaterialButton && ((MaterialButton) child).isChecked()) { toggleGroupCheckedIds.put(toggleGroup, child.getId()); break; } } // 设置选中监听 toggleGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> { // 因为设置了singleSelection和selectionRequired,isChecked始终为true toggleGroupCheckedIds.put(group, checkedId); }); }之后需要获取某个ToggleGroup的选中ID时,直接从Map中取:
Integer checkedId = toggleGroupCheckedIds.get(toggleGroup1); if (checkedId != null) { // 处理选中ID }
这样就能实时准确地获取每个ToggleGroup的选中按钮ID了,避开了组件自身的bug。
内容的提问来源于stack exchange,提问作者Александр Инженер
相关产品推荐
相关产品推荐

