为什么NavigationView的可选中菜单项运行时不显示复选框
问题原因
出现该问题的核心是运行时应用主题与Material NavigationView 组件的默认样式不匹配,具体有两个常见诱因:
- 应用全局主题未继承
Theme.MaterialComponents系列主题,仍使用老式Theme.AppCompat系列主题,导致NavigationView可勾选菜单项的默认复选框样式无法正常加载。Android Studio预览时使用IDE默认主题,因此显示正常,运行时调用应用自定义主题就会出现异常。 - 部分高版本Material Components库中,可勾选菜单项如果没有显式指定勾选状态图标,默认不会渲染复选框占位。
解决方案
方案1:修正主题配置(优先推荐)
将应用全局主题的父类修改为Theme.MaterialComponents系列的对应主题即可,示例如下:
<!-- res/values/styles.xml --> <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 保留原有其他主题配置 --> </style>
如果不需要修改全局主题,也可以单独给NavigationView指定Material风格主题:
<com.google.android.material.navigation.NavigationView android:id="@+id/navigationView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:theme="@style/Theme.MaterialComponents.DayNight.NoActionBar" app:menu="@menu/activity_foo_view"/>
方案2:手动指定勾选图标
如果修改主题不符合项目需求,可以手动给可勾选菜单项指定复选框状态选择器:
- 首先新建勾选状态选择器
res/drawable/nav_checkbox_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/ic_check_box_checked" /> <item android:state_checked="false" android:drawable="@drawable/ic_check_box_unchecked" /> </selector>
- 然后在
NavigationView中配置即可(如果使用的Material组件版本低于1.4.0,没有app:itemCheckableIcon属性,直接给每个menu item添加android:icon="@drawable/nav_checkbox_selector"属性即可):
<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/activity_foo_view" app:itemIconTint="@color/your_icon_tint" app:itemCheckableIcon="@drawable/nav_checkbox_selector"/>
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

