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

我创build了两个独特的ID(我需要一个分隔符),他们都有checkableBehavior设置为 。 这允许一次检查来自不同组的多个项目,而这正是我想要避免的。 我希望最大限度地检查所有组中的一个项目。

由于我没有find任何方法来做到这一点在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; } }); 

我需要一个提示! 谢谢。

Solutions Collecting From Web of "如何在NavigationView中的所有组中设置共享的可检查行为?"

这是解决scheme。

第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; } }); 

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

@ Moinkhan的解决scheme应该也能工作(谢谢,upvoted),但是我不想在每次select一个新的位置时循环菜单的项目。

实际上,你不需要单独的分组并行分组。 您可以将所有内容放在一个组中,并将子菜单(包含标题)或子组(无标题)放入其中。 这些子菜单和子组将会有分隔符。 这样可检查的行为没有解决方法。 (Fyi:这是在devise支持库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> 

在代码中,我只是做了以下和单一的检查按预期工作:

 @Override public boolean onNavigationItemSelected(MenuItem item) { mNavigationView.setCheckedItem(item.getItemId()); ... } 

不需要删除checkableBehavior="single" ,只需使用

 navigationView.setCheckedItem(item.getItemId()); 

而不是item.setChecked(true)

好吧,我find了解决scheme..只需将此代码片段添加到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)不工作。 只是因为从菜单列表中应该有一个单一的项目必须被嘲笑。 所以当你select另一个项目时,你只能取消选中它。如果你点击选定的项目,导航视图将永远不会取消选中它。 只是因为我已经解释的情况。

NavigationView实现中似乎有一个失效错误,但是你不需要使用setCheckable() ,你只需要在调用setChecked(false)之后使NavigationView无效,如下所示:

  previousItem.setChecked(false); navigationView.invalidate(); 

但是菜单组不能有checkableBehavior="single" ,因为在独占模式下,组中的MenuItem调用setChecked(boolean)会将该项设置为检查是否传递true或false。 所以为了使setChecked(false)起作用,必须从菜单定义中删除checkableBehavior="single"

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

这里是我发布在这里的一个简单而甜蜜的解决scheme

制作不同的组会在两者之间形成一个分隔线但是在导航抽屉中产生了两个被选中的项目的问题。

我如何处理这个简单的方法是:

  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); 

}