如何取消BottomNavigationView首个菜单项自动选中?已尝试setChecked(false)无效
我之前也碰到过这个坑!直接调用navigation.getMenu().getItem(0).setChecked(false)没生效,主要是因为BottomNavigationView在初始化过程中会自动选中第一个菜单项,你在onCreate里的调用时机太早,被系统后续的默认选中逻辑覆盖了。试试下面这几个可行的解决方案:
方案一:用post()延迟执行修改操作
通过post()把修改选中状态的逻辑放到视图初始化完成后执行,这样就能覆盖系统的默认选中行为:
BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); // 延迟到视图初始化完成后再取消选中第一个item navigation.post(new Runnable() { @Override public void run() { navigation.getMenu().getItem(0).setChecked(false); } });
方案二:配合菜单文件配置取消默认选中
先确保你的菜单文件(比如res/menu/bottom_nav_menu.xml)里没有给任何菜单项设置android:checked="true",然后在代码中初始化时,配合post取消所有选中状态:
BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); // 延迟执行,确保视图初始化完成后取消所有item的选中状态 navigation.post(() -> { for (int i = 0; i < navigation.getMenu().size(); i++) { navigation.getMenu().getItem(i).setChecked(false); } });
方案三:反射修改内部选中逻辑(进阶)
如果上面的方法都不满足需求,你可以通过反射修改BottomNavigationView的内部选中逻辑,不过这种方法需要注意版本兼容性:
BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); try { Field field = BottomNavigationView.class.getDeclaredField("mSelectedItemId"); field.setAccessible(true); field.set(navigation, -1); // 设置选中id为-1,即无选中项 } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Tsur Yohananov
相关产品推荐
相关产品推荐

