BottomNavigationMenu首个菜单项禁用后样式不生效该如何解决?
问题根因
这个问题是两个因素共同导致的:
BottomNavigationView默认会自动将菜单的第一个条目设为选中状态- 你定义的颜色选择器(selector)的状态匹配顺序错误,
state_checked的判断放在了state_enabled之前。Android的selector是按从上到下的顺序匹配状态的,只要匹配到符合的条目就会直接使用,不会继续往下判断。所以第一个已经被默认选中的条目,哪怕你设置了enabled=false,也会优先命中state_checked=true的样式,不会走禁用状态的配置。
你其他禁用的菜单项默认不会被选中,所以可以正常触发禁用样式,和你遇到的现象完全吻合。
解决方案
方法1:调整selector的状态顺序(必选)
将禁用状态的判断放到selector的最顶部,保证禁用状态优先级最高,不管条目是否被选中,只要禁用就会优先使用禁用样式:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 禁用状态放在最前面,优先级最高 --> <item android:color="#BEBEBE" android:state_enabled="false"/> <item android:color="@color/secondaryColor" android:state_checked="true"/> <item android:color="@color/secondaryColor" android:state_enabled="true"/> </selector>
方法2:可选补充配置
如果你不需要第一个条目默认选中,可以额外添加代码手动设置默认选中项:
// 禁用第一个菜单 bottomNavigationView.getMenu().getItem(0).setEnabled(false); // 手动指定你需要默认选中的项,比如第二个项item2 bottomNavigationView.setSelectedItemId(R.id.item2);
内容的提问来源于stack exchange,提问作者JavaForAndroid
相关产品推荐
相关产品推荐

