You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NavigationView选中项颜色异常:双DrawerLayout布局表现不一致

解决NavigationView选中项颜色不生效的问题

你遇到的这个问题确实挺棘手的——明明都是用DrawerLayout+NavigationView,逻辑也差不多,一个能正常显示选中项的颜色,另一个却不行,而且两者的「Profil」项默认都标记为选中状态。我帮你梳理几个最可能的原因和对应的解决办法:


1. 先检查Menu资源文件的差异

你第一个布局用的是@menu/menu_passager,第二个司机端的Menu文件虽然没贴出来,但这大概率是问题的源头:

  • 确保司机端的每个Menu Item都添加了android:checkable="true"属性,没有这个属性的话,选中状态根本不会生效。比如:
    <item
        android:id="@+id/profile_item_cond"
        android:title="Profil"
        android:checkable="true"/>
    
  • 检查NavigationView的颜色配置:如果你的选中项颜色是通过selector实现的,要确认司机端的NavigationView有没有正确引用这个selector。比如先创建一个颜色选择器res/color/nav_item_selector.xml:
    <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>
    
    然后在司机端的NavigationView XML里添加:
    app:itemTextColor="@color/nav_item_selector"
    app:itemIconTint="@color/nav_item_selector"
    

2. 排查setUpToolbar(item)方法的影响

第二个布局的代码里多次调用了setUpToolbar(item),这个自定义方法很可能无意中修改了MenuItem的选中状态。你可以打开这个方法看看:

  • 有没有写类似item.setChecked(false)的代码?这会直接取消选中状态;
  • 如果方法里只是设置Toolbar标题,那没问题,但如果有其他操作MenuItem的逻辑,一定要确保它不会干扰选中状态。

3. 手动确保选中状态被正确标记

即使默认选中了「Profil」,有时候初始化或切换页面时选中状态会丢失,你可以做这两步:

  • 在司机端Activity的onCreate方法里,手动设置初始选中项:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_driver_layout);
        // ...其他初始化代码
        NavigationView navigationView = findViewById(R.id.your_driver_nav_view);
        navigationView.setCheckedItem(R.id.profile_item_cond); // 确保初始选中Profil
    }
    
  • 在onNavigationItemSelected方法里,处理完每个Item后,手动标记它为选中:
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
        switch (item.getItemId()) { 
            case R.id.acceuil_item_conducteur: 
                setUpToolbar(item); 
                fm.beginTransaction().replace(R.id.frame_conducteur, new AcceuilConducteurFragment()).commit(); 
                break; 
            // 其他case逻辑...
        } 
        item.setChecked(true); // 加上这行,强制标记当前Item为选中
        drawer.closeDrawer(GravityCompat.START); 
        return true; 
    }
    

4. 检查NavigationView的初始化差异

最后再确认两个Activity里初始化NavigationView的代码完全一致:

  • 有没有都设置了setNavigationItemSelectedListener(this)?
  • 有没有其他代码(比如主题、样式)覆盖了NavigationView的选中状态样式?

按照上面的步骤排查,应该能快速定位到问题所在。优先检查Menu资源和setUpToolbar方法,这两个是最容易出问题的地方。

内容的提问来源于stack exchange,提问作者Manel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:58:13