Android导航栏右侧菜单图标选中时无法变色的问题求助
嘿,我来帮你搞定这个右侧菜单图标选中不变色的坑!这个问题本质是NavigationView的默认样式逻辑只覆盖了左侧导航菜单项,右侧的action menu需要我们手动配置状态选择器和选中状态。下面是具体的解决步骤:
1. 创建图标状态选择器
首先在res/drawable目录下新建一个状态选择器文件(比如menu_icon_selector.xml),用来定义图标选中和未选中的颜色:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 选中状态的颜色 --> <item android:color="@color/your_selected_color" android:state_checked="true"/> <!-- 默认状态的颜色 --> <item android:color="@color/your_default_color"/> </selector>
记得把your_selected_color和your_default_color换成你项目里实际的颜色值。
2. 自定义右侧MenuItem的布局
因为默认的右侧MenuItem布局不会自动应用状态选择器,我们需要自定义一个布局文件。在res/layout下新建right_menu_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal" android:paddingHorizontal="16dp"> <ImageView android:id="@+id/menu_icon" android:layout_width="24dp" android:layout_height="24dp" android:tint="@drawable/menu_icon_selector"/> </LinearLayout>
这个布局只保留了图标区域,如果需要显示文字,可以添加TextView组件。
3. 修改menu.xml配置
打开你的menu.xml,给每个右侧菜单项添加android:actionLayout属性,指向我们刚创建的自定义布局,同时加上android:checkable="true"开启选中状态:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_setting" android:icon="@drawable/ic_setting" android:title="设置" android:checkable="true" android:actionLayout="@layout/right_menu_item"/> <!-- 其他右侧菜单项同理配置 --> </menu>
4. 代码中处理选中状态
在你的Activity/Fragment里,给NavigationView设置选中监听器,确保选中时更新菜单项的checked状态,同时同步自定义布局里的图标:
navigationView.setNavigationItemSelectedListener { menuItem -> // 取消所有已选中的菜单项 navigationView.menu.forEach { it.isChecked = false } // 标记当前项为选中 menuItem.isChecked = true // 更新自定义布局里的图标(保证图标资源和状态匹配) menuItem.actionView?.findViewById<ImageView>(R.id.menu_icon)?.setImageDrawable(menuItem.icon) // 这里添加你的页面跳转/逻辑处理 true }
如果是Java项目,对应的代码如下:
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // 取消所有选中项 for (int i = 0; i < navigationView.getMenu().size(); i++) { navigationView.getMenu().getItem(i).setChecked(false); } // 设置当前项选中 item.setChecked(true); // 更新图标 ImageView icon = item.getActionView().findViewById(R.id.menu_icon); if (icon != null) { icon.setImageDrawable(item.getIcon()); } // 处理业务逻辑 return true; } });
额外技巧:全局配置(如果左右菜单都需要统一样式)
如果你的左右菜单图标都需要统一的选中变色效果,可以直接在NavigationView的布局里设置app:itemIconTint属性,指向我们创建的状态选择器:
<com.google.android.material.navigation.NavigationView android:id="@+id/navigationView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" app:menu="@menu/your_menu" app:itemIconTint="@drawable/menu_icon_selector"/>
这种方法更简单,但会作用于所有菜单项,适合不需要区分左右样式的场景。
内容的提问来源于stack exchange,提问作者Android Developer

