以编程方式添加的导航抽屉项在选中时不会突出显示

问题描述

我已经创建了一个导航抽屉。

菜单XML”位于 main_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<menu ...
    tools:showIn="navigation_view">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_table_chart_black_24dp"
            android:title="@string/menu_topic_home" />
        <item
            android:id="@+id/nav_plan"
            android:icon="@drawable/ic_table_chart_black_24dp"
            android:title="@string/menu_plan" />
    </group>
</menu>

导航视图以XML添加- main_activity.xml

<androidx.drawerlayout.widget.DrawerLayout
    ... >

<FrameLayout ...> </FrameLayout>

    <com.google.android.material.navigation.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/main_drawer"/>
    
    </androidx.drawerlayout.widget.DrawerLayout>

除了您在XML中看到的Home和Plan这两个菜单项以外,很少使用以下代码以编程方式在导航菜单添加菜单

mNavigationView = findViewById(R.id.nav_view)
Menu navigationMenu = mNavigationView.getMenu();                
for(int inx = 0; inx < myMenuItems.size() ; inx ++) {
    navigationMenu
       .add(0,inx,myMenuItems.get(inx))
       .setIcon(R.drawable.ic_table_chart_black_24dp)
       .setonMenuItemClickListener(this);
}

在侦听器(这是主要活动)中,代码如下:

@Override
public boolean onMenuItemClick(MenuItem item) {
     
     // Fragment setting code here

     item.setChecked(true);
     mNavigationView.setCheckedItem(item.getItemId());
}

使用此代码菜单出现并显示如下(注意,当前主页已选中,并突出显示[重要])

enter image description here

现在,当我选择另一个菜单项(以编程方式添加一个,然后将其选中,但未突出显示

enter image description here

有任何线索吗?

解决方法

您必须指定MenuItem对象isCheckable。像这样:

MenuItem item = navigationMenu
       .add(0,inx,myMenuItems.get(inx))
item.isCheckable = true
...
,

如果我没记错的话,您有一组可检查的菜单项,并且想要向其中添加新项。因此,首先,您应该为该组分配一个唯一的ID,以便可以找到它以添加新项目。

<?xml version="1.0" encoding="utf-8"?>
<menu ...
    tools:showIn="navigation_view">

    <group android:id="@+id/group1"  // <--- assigning an id
        android:checkableBehavior="single">

        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_table_chart_black_24dp"
            android:title="@string/menu_topic_home" />
        <item
            android:id="@+id/nav_plan"
            android:icon="@drawable/ic_table_chart_black_24dp"
            android:title="@string/menu_plan" />
    </group>
</menu>

然后,当您要添加新菜单项时,将组ID传递给add方法,并启用其可检查性:

navigationMenu
    .add(R.id.group1,Menu.NONE,myMenuItems.get(inx))  // <--- pass the group's id
    .setIcon(R.drawable.ic_table_chart_black_24dp)
    .setCheckable(true)                               // <--- enable item's checkability
    .setOnMenuItemClickListener(this);