如何修改NavigationDrawer中单个导航菜单项的文字颜色
问题原因
你当前使用TextAppearanceSpan设置颜色不生效,是因为Material Components的NavigationView默认自带全局菜单项文字颜色tint规则,优先级高于Span样式,会覆盖你设置的文字颜色。
可行解决方案
方案1:替换为更高优先级的ForegroundColorSpan
直接修改你现有的Java代码,把TextAppearanceSpan替换为ForegroundColorSpan,必要时关闭全局文字tint:
navigationView.setItemIconTintList(null); // 确保从NavigationView获取正确的Menu实例 Menu menu = navigationView.getMenu(); MenuItem emergencyItem = menu.findItem(R.id.emergencyCallNavigationDrawer); SpannableString spannableTitle = new SpannableString(emergencyItem.getTitle().toString()); // 直接设置前景色,优先级高于NavigationView默认样式 spannableTitle.setSpan( new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red)), 0, spannableTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE ); emergencyItem.setTitle(spannableTitle); // 如果以上代码仍不生效,再加一行关闭全局文字tint即可 // 注意:加这行后其他菜单项文字会变回系统默认黑色,需要你单独给其他项设置颜色 // navigationView.setItemTextColor(null);
方案2:自定义单个菜单项布局(更稳定,推荐)
如果不想影响其他菜单项的默认样式,可以单独给紧急呼叫项自定义布局:
- 新建
res/layout/nav_item_emergency.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:textColor="@color/red" android:textSize="16sp" android:drawablePadding="32dp" android:drawableStart="@drawable/你的紧急呼叫图标资源名" />
- 修改导航菜单的XML文件(一般为
res/menu/nav_drawer_menu.xml),给紧急呼叫项关联自定义布局:
<item android:id="@+id/emergencyCallNavigationDrawer" android:title="Emergency Call" app:actionLayout="@layout/nav_item_emergency" />
- 原有Java代码中不需要再设置Spannable相关逻辑,菜单项的点击事件依然可以通过
onNavigationItemSelected正常监听,无兼容性问题。
内容的提问来源于stack exchange,提问作者Jeff Tan
相关产品推荐
相关产品推荐

