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

时间:2015-06-10 20:42:09

标签: android navigation-drawer android-support-library material-design navigationview

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

由于我在XML中找不到任何方法,我尝试在onNavigationItemSelected中实现一个简单的逻辑来取消选中上一个菜单项:

if (previousItem != null)
   previousItem.setChecked(false);
currentItem.setChecked(true);

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>

NavigationItemSelectedListener:

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

我需要一个提示!感谢。

5 个答案:

答案 0 :(得分:36)

这是解决方案。

第1步:删除

android:checkableBehavior="single"

来自两个小组。

步骤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;
                }
            });

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

@Moinkhan的解决方案也应该有效(谢谢,upvoted),但每次选择新位置时我都不想循环浏览菜单项。

答案 1 :(得分:5)

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

即可
navigationView.setCheckedItem(item.getItemId());

而不是item.setChecked(true)

答案 2 :(得分:4)

好的我找到了解决方案.. 只需将此代码段添加到onNavigationItemSelected方法

即可
@Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {
    Menu m = navView.getMenu();
    for (int i=0;i<m.size();i++) {
        MenuItem mi = m.getItem(i);
        if (!(mi.getItemId() == menuItem.getItemId())) {
            mi.setCheckable(false);
        }
    }
    menuItem.setCheckable(true);
    menuItem.setChecked(true);
    return false;
}

那是...... 是的 setChecked(false)无效。只是因为从菜单列表中应该有一个单项必须被cheked。因此,您只能在选择其他项目时取消选中它。如果您单击所选项目,导航视图将永远不会取消选中它。仅仅因为这个场景我已经解释了。

答案 3 :(得分:3)

NavigationView实施中似乎存在失效错误,但您不需要使用setCheckable(),只需在调用{{NavigationView后使其失效1}},像这样:

setChecked(false)

但是,菜单组不能包含 previousItem.setChecked(false); navigationView.invalidate(); ,因为在独占模式下,在组中的checkableBehavior="single"上调用setChecked(boolean)会将该项设置为已检查是否传递true或false。因此,要使MenuItem生效,您必须从菜单定义中删除setChecked(false)

我在这里创建了一个问题:https://code.google.com/p/android/issues/detail?id=178709

答案 4 :(得分:1)

这是一个简单而又甜蜜的解决方案,我发布了here :)

制作不同的组确实会在两者之间形成分隔符但是会在导航抽屉中创建两个已检查项目的问题。

我处理这个问题的一个简单方法是:

 public boolean onNavigationItemSelected(final MenuItem menuItem) {

//if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item
if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) {


    navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true);
    navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true);
   }else{

    navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true);
    navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true);


}
//Update highlighted item in the navigation menu
menuItem.setChecked(true);

}