如何在NavigationView中的所有组中设置共享可检查行为?

Eye*_*ear 31 android android-support-library navigation-drawer material-design navigationview

我创建了两个具有唯一ID的组(我需要一个分隔符),它们都checkableBehavior设置为单一.这允许同时检查来自不同组的多个项目,这正是我想要避免的.我想在所有群组中最多检查一件商品.

由于我还没有找到任何方法在XML中执行此操作,我尝试实现一个简单的逻辑onNavigationItemSelected来取消选中上一个菜单项:

if (previousItem != null)
   previousItem.setChecked(false);
currentItem.setChecked(true);
Run Code Online (Sandbox Code Playgroud)

setChecked(false)方法从来没有对我有用 - 项目保持检查.

这是我的示例代码:

menu_navigation.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
        android:id="@+id/nav_group_1"
        android:checkableBehavior="single">
    <item
            android:id="@+id/nav_feed"
            android:title="@string/feed"/>
    <item
            android:id="@+id/nav_people"
            android:title="@string/people"/>
</group>
<group
        android:id="@+id/nav_group_2"
        android:checkableBehavior="single">
    <item
            android:id="@+id/nav_settings"
            android:title="@string/settings"/>
    <item
            android:id="@+id/nav_help_feedback"
            android:title="@string/help_feedback"/>
    <item
            android:id="@+id/nav_logout"
            android:title="@string/logout"/>
</group>
Run Code Online (Sandbox Code Playgroud)

NavigationItemSelectedListener:

 mUiNavigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        if (previousItem != null)
                           previousItem.setChecked(false);
                        currentItem.setChecked(true);
                        //...
                        changeCurrentFragment(...);
                        return true;
                    }
                });
Run Code Online (Sandbox Code Playgroud)

我需要一个提示!谢谢.

Eye*_*ear 37

这是解决方案.

第1步:删除

android:checkableBehavior="single"
Run Code Online (Sandbox Code Playgroud)

来自两个团体.

第2步:将以下逻辑添加到侦听器:

mUiNavigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    menuItem.setCheckable(true);
                    menuItem.setChecked(true);
                    if (mPreviousMenuItem != null) {
                        mPreviousMenuItem.setChecked(false);
                    }
                    mPreviousMenuItem = menuItem;
                    //...
                    changeCurrentFragment(...);
                    return true;
                }
            });
Run Code Online (Sandbox Code Playgroud)

注意:menuItem.setCheckable(true)您可以android:checkable="true"为XML中的每个项目设置而不是调用.

@Moinkhan的解决方案应该也能正常工作(谢谢,upvoted),但每次选择新位置时我都不想循环浏览菜单项.

  • 逻辑应该是`if(mPreviousMenuItem!= null && mPreviousMenuItem!= menuItem){...}`否则连续两次选择相同的菜单项取消选中它.我假设大多数人不会想要这种行为. (2认同)

Til*_*ill 9

实际上,您不需要用于分隔符的单独并行组.您可以将所有内容放在一个组中,并在其中放置子菜单(包含标题)或子组(无标题).这些子菜单和子组将有分隔符.这样,可检查行为无需解决方法. (Fyi:这是在Design Support Lib 23.1.1上)

带分隔线的菜单

<group
    android:id="@+id/drawer_group"
    android:checkableBehavior="single">
    <item
        android:id="@+id/nav_1"
        android:title="Menu1" />
    <item
        android:id="@+id/nav_2"
        android:title="Menu2" />
    <item
        android:id="@+id/nav_3"
        android:title="Menu3" />
    <item
        android:id="@+id/nav_4"
        android:title="Menu4" />

    <item
        android:id="@+id/drawer_submenu"
        android:title="Subheader">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_sub1_1"
                    android:title="Menu_Sub1_1" />
                <item
                    android:id="@+id/nav_sub1_2"
                    android:title="Menu_Sub1_2" />
            </group>
        </menu>
    </item>

    <group android:id="@+id/drawer_subgroup">
        <item
            android:id="@+id/nav_subgroup_item"
            android:title="Menu_Sub2_2" />
    </group>
</group>
Run Code Online (Sandbox Code Playgroud)

在代码中,我只是执行以下操作,单个检查按预期工作:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    mNavigationView.setCheckedItem(item.getItemId());
    ...
}
Run Code Online (Sandbox Code Playgroud)


Jah*_*hid 5

无需删除checkableBehavior="single",只需使用

navigationView.setCheckedItem(item.getItemId());
Run Code Online (Sandbox Code Playgroud)

而不是item.setChecked(true).

  • 我唠叨这个背驮了很长时间,最后,你的解决方案奏效了.我不能说谢谢!不知道为什么我尝试的其他一切都不起作用,但很高兴终于有了解决方案.说真的,谢谢!! 疯了...... (2认同)