不同分组中选中的导航抽屉菜单项

14

我有一个工作中的导航抽屉,并在使用菜单组和菜单头时遇到了一些问题,menuItem.setChecked(true); 没有按预期突出显示菜单项。

这是我的XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ActivityMap">

    <group android:checkableBehavior="single">


        <item
            android:id="@+id/nav_welcome"
            android:icon="@drawable/abc_btn_check_to_on_mtrl_000"
            android:title="Welcome" />
        <item
            android:id="@+id/nav_map_showmap"
            android:icon="@mipmap/ic_map_black_24dp"
            android:title="Show Map" />
        <item
            android:icon="@mipmap/ic_list_black_24dp"
            android:title="Show List" />

        <item android:title="Settings">
            <menu>

                <item
                    android:id="@+id/nav_database_check"
                    android:icon="@mipmap/ic_cloud_done_black_24dp"
                    android:title="Update Database" />
                <item
                    android:id="@+id/nav_map_settings"
                    android:icon="@mipmap/ic_settings_black_24dp"
                    android:title="App Preferences" />

            </menu>
        </item>


        <item android:title="General">
            <menu>

                <item
                    android:id="@+id/nav_general_about"
                    android:icon="@mipmap/ic_info_black_24dp"
                    android:title="About" />
                <item
                    android:id="@+id/nav_general_help"
                    android:icon="@mipmap/ic_help_black_24dp"
                    android:title="Help" />
                <item
                    android:id="@+id/nav_general_report"
                    android:icon="@mipmap/ic_email_black_24dp"
                    android:title="Feedback / Report error" />
            </menu>
        </item>
    </group>
</menu>

如您所见,我有3个菜单项,然后是一个包含2个菜单项的“设置”组,最后是一个包含3个菜单项的“常规”组。

现在,在前三个菜单项中,menuItem.setChecked(true);按预期工作,并突出显示该菜单项。然而,在子集(“设置”或“常规”子集)中的以下任何菜单项都没有正确地突出显示。

我读到<group android:checkableBehaviour="single">可以封装整个块,但似乎不起作用。

有什么想法吗?干杯。

编辑 - 添加了菜单结构的截图

enter image description here


也许你的问题与这个这个相同。 - BNK
尝试将"<group android:checkableBehavior="single">"放置在设置和通用菜单下面,而不是在外部菜单中,就像我之前评论中第二个链接中的那样。 - BNK
2
然而,在子集合内(“设置”或“常规”子集)中的以下菜单项都没有正确地突出显示。它们在做什么?它们应该做什么? - Eugen Pechanec
你能分享一下你的OnNavigationItemSelectedListener代码吗? - Rajen Raiyarela
从我的原帖来看,前三个功能(欢迎、显示地图、显示列表)可以正常运行。当点击其他选项时,它们并没有高亮(原先的三个选项中仍有一个被高亮)。 - Jammo
显示剩余2条评论
5个回答

23

更新

如果您已将Android Studio升级到1.4,则可以使用导航抽屉式活动模板创建新项目。然后,可以将菜单文件更新为以下内容(请注意在"Communicate""BNK"两个子菜单中的两行<group android:checkableBehavior="single">):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item android:id="@+id/nav_camara" android:icon="@android:drawable/ic_menu_camera"
            android:title="Import" />
        <item android:id="@+id/nav_gallery" android:icon="@android:drawable/ic_menu_gallery"
            android:title="Gallery" />
        <item android:id="@+id/nav_slideshow" android:icon="@android:drawable/ic_menu_slideshow"
            android:title="Slideshow" />
        <item android:id="@+id/nav_manage" android:icon="@android:drawable/ic_menu_manage"
            android:title="Tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/nav_share" android:icon="@android:drawable/ic_menu_share"
                android:title="Share" />
                <item android:id="@+id/nav_send" android:icon="@android:drawable/ic_menu_send"
                android:title="Send" />
            </group>
        </menu>
    </item>

    <item android:title="BNK">
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/nav_share_bnk" android:icon="@android:drawable/ic_menu_share"
                    android:title="Share BNK" />
                <item android:id="@+id/nav_send_bnk" android:icon="@android:drawable/ic_menu_send"
                    android:title="Send BNK" />
            </group>
        </menu>
    </item>
</menu>

以下是截图

BNK's screenshot

更新结束


如我所评论的,请尝试将<group android:checkableBehavior="single">放置在“设置”和“常规”菜单下,而不是放在外部菜单下方。这意味着您将拥有2个组。希望这可以帮助您!


我已经尝试过了,但是使用多个<group android:checkableBehaviour="single">会使多个可选择的部分出现。因此,它们变得突出显示,但是我有3个部分可以单独突出显示(即同时突出显示3个部分)。 - Jammo
我认为你可以手动设置其他未被代码高亮显示的部分。 - BNK
在我的一个项目中,我的导航抽屉使用了ListView项而不是菜单项,并且我通过在DrawerItemClickListener中设置高亮背景来实现这个逻辑。 - BNK

6

<group android:checkableBehavior="single">
    <item
        android:id="@+id/nav_vi_tri"
        android:icon="@drawable/ic_menu_camera"
        android:title="Vị trí" />
    <item
        android:id="@+id/nav_xem_lai"
        android:icon="@drawable/ic_menu_gallery"
        android:title="Xem lại hành trình" />
    <item
        android:id="@+id/nav_hinh_anh"
        android:icon="@drawable/ic_menu_slideshow"
        android:title="Hình ảnh" />

    <item android:title="Báo cáo">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_baocao1"
                    android:icon="@drawable/ic_menu_camera"
                    android:title="Hành trình xe chạy" />
                <item
                    android:id="@+id/nav_baocao2"
                    android:icon="@drawable/ic_menu_gallery"
                    android:title="Tốc độ của xe" />
                <item
                    android:id="@+id/nav_baocao3"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Quá tốc độ" />
                <item
                    android:id="@+id/nav_baocao4"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Thời gian lái" />
                <item
                    android:id="@+id/nav_baocao5"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Dừng đỗ" />
                <item
                    android:id="@+id/nav_baocao6"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Tổng hợp theo xe" />
                <item
                    android:id="@+id/nav_baocao7"
                    android:icon="@drawable/ic_menu_slideshow"
                    android:title="Quãng đường nhiên liệu" />
            </group>
        </menu>

    </item>

    <item android:title="Communicate">

        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_tien_ich"
                    android:icon="@drawable/ic_menu_share"
                    android:title="Tiện ích" />
                <item
                    android:id="@+id/nav_logout"
                    android:icon="@drawable/ic_menu_send"
                    android:title="Đăng xuất" />
            </group>
        </menu>

    </item>


</group>

这对我很有效:D


这对我也起作用了,缺失的部分是一个带有checkableBehavior="single"的嵌套组。我想应该只有一个组,因为子组可能有自己的选中项,但事实并非如此。 - Carvell Wakeman

1
在这里,您可以使用三个不同的组:顶部、中心和底部。第一个顶部组将有3个菜单项,就像您一样。然后中心组可以与您的“设置”菜单相同,有2个项目。底部组将有2个项目,就像通用设置中一样。
在您的Java文件中,您可以处理“Item Selected Listener”来处理导航菜单的项目单击。
// This method will trigger on item Click of navigation menu
        @Override
        public boolean onNavigationItemSelected(MenuItem p_menuItem) {

            //Checking if the item is in checked state or not, if not make it in checked state

            if(p_menuItem.getGroupId()==R.id.menu_top){
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,true,true);
            }
            else if(p_menuItem.getGroupId()==R.id.menu_center){
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,true,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,false,true);
            }
            else{
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_bottom,true,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_center,false,true);
                m_navigationView.getMenu().setGroupCheckable(R.id.menu_top,false,true);
            }

            p_menuItem.setChecked(true);
            m_drawerLayout.closeDrawers();

1
这对于一个应该很简单的小UI来说似乎非常混乱?我的XML没有任何问题,阻止了setChecked()的正确工作吗? - Jammo
我认为在这种情况下需要使用setChecked。 - Ryan Fung

0

在您的代码中,将闭合组标记</group>的位置更改如下:

仔细观察位置并执行。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ActivityMap">

    <group android:checkableBehavior="single">


        <item
            android:id="@+id/nav_welcome"
            android:icon="@drawable/abc_btn_check_to_on_mtrl_000"
            android:title="Welcome" />
        <item
            android:id="@+id/nav_map_showmap"
            android:icon="@mipmap/ic_map_black_24dp"
            android:title="Show Map" />
        <item
            android:icon="@mipmap/ic_list_black_24dp"
            android:title="Show List" />
    </group>

        <item android:title="Settings">
            <menu>

                <item
                    android:id="@+id/nav_database_check"
                    android:icon="@mipmap/ic_cloud_done_black_24dp"
                    android:title="Update Database" />
                <item
                    android:id="@+id/nav_map_settings"
                    android:icon="@mipmap/ic_settings_black_24dp"
                    android:title="App Preferences" />

            </menu>
        </item>


        <item android:title="General">
            <menu>

                <item
                    android:id="@+id/nav_general_about"
                    android:icon="@mipmap/ic_info_black_24dp"
                    android:title="About" />
                <item
                    android:id="@+id/nav_general_help"
                    android:icon="@mipmap/ic_help_black_24dp"
                    android:title="Help" />
                <item
                    android:id="@+id/nav_general_report"
                    android:icon="@mipmap/ic_email_black_24dp"
                    android:title="Feedback / Report error" />
            </menu>
        </item>
</menu>

你试过我的答案了吗? - Vipin Kumar

0

试试这个:

 private int selectedItem = 0; 

  private void setSelectedItem(MenuItem menuItem, int position) {

          mNavigationView.getMenu().getItem(selectedItem).setChecked(false);
          mNavigationView.getMenu().getItem(position).setChecked(true);

          if (menuItem.getGroupId() == R.id.group_2) {
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_1, false, true);
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_2, true, true);
                } else {
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_1, true, true);
                    mNavigationView.getMenu().setGroupCheckable(R.id.group_2, false, true);
                }
                //Update highlighted item in the navigation menu
                menuItem.setChecked(true);
                selectedItem = position;
    }

类似于之前的回答。在编程中这样做似乎很混乱,不如依赖于 XML 的行为? - Jammo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接