2016-01-22 89 views
4

我在DrawerLayout中将以下activity_nav_drawer_drawer.xml作为应用程序的菜单:NavigationView。NavigationView/DrawerLayout中的独立checkableBehavior =“单个”组

<?xml version="1.0" encoding="utf-8"?> 

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

    <group android:id="@+id/nav_group_features" 
      android:checkableBehavior="single"> 

     <item android:id="@+id/nav_feature1" 
       android:icon="@drawable/ic_build_black" 
       android:title="Feature 1"/> 

     <item android:id="@+id/nav_feature2" 
       android:icon="@drawable/ic_account_balance_black" 
       android:title="Feature 2"/> 

     <item android:id="@+id/nav_feature3" 
       android:icon="@drawable/ic_folder_black" 
       android:title="Feature 3"/> 

    </group> 

    <item android:title="Select Project"> 
     <group android:id="@+id/nav_group_projects" 
       android:checkableBehavior="single"> 

      <item android:id="@+id/nav_project1" 
        android:icon="@drawable/ic_domain_black" 
        android:title="Project 1"/> 

      <item android:id="@+id/nav_project2" 
        android:icon="@drawable/ic_domain_black" 
        android:title="Project 2"/> 

      <item android:id="@+id/nav_project3" 
        android:icon="@drawable/ic_domain_black" 
        android:title="Project 3"/> 

     </group> 
    </item> 

</menu> 

这里是包含DrawerLayout。

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" 
             xmlns:android="http://schemas.android.com/apk/res/android" 
             xmlns:app="http://schemas.android.com/apk/res-auto" 
             xmlns:tools="http://schemas.android.com/tools" 
             android:layout_width="match_parent" 
             android:layout_height="match_parent" 
             android:fitsSystemWindows="true" 
             tools:openDrawer="start"> 

    <include layout="@layout/app_bar_nav_drawer" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

    <android.support.design.widget.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_nav_drawer" 
                app:menu="@menu/activity_nav_drawer_drawer"/> 

</android.support.v4.widget.DrawerLayout> 

活动实现了NavigationView.OnNavigationItemSelectedListener与流动的听众。

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    return true; 
} 

问题是如果从一个组中选择一个项目,它将取消选择另一个组中的所选项目。我需要每个组都有独立的选择。你怎么做到这一点?

回答

4

对我来说,它看起来像一个在NavigationView本身的错误,并且Google的bugtracker中有几个类似的问题(如this one或this)。

enter image description here

然而,你可以将其存档,这样做:

  • 跟踪先前选择MenuItem S的各组
  • 一旦项目点击 - 取消该组先前检查元素并检查新的
  • 从xml中删除android:checkableBehavior并为每个添加android:checkable="true"MenuItem

有实际执行:

MenuItem selectedFeature, selectedProject; 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    if (item.getGroupId() == R.id.group_feature) { 
     if (selectedFeature != null) { 
      selectedFeature.setChecked(false); 
     } 
     selectedFeature = item; 
     selectedFeature.setChecked(true); 
    } else if (item.getGroupId() == R.id.group_projects) { 
     if (selectedProject != null) { 
      selectedProject.setChecked(false); 
     } 
     selectedProject = item; 
     selectedProject.setChecked(true); 
    } 

    return false; 
} 

而且activity_main_drawer.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group 
     android:id="@+id/group_feature"> 
     <item android:id="@+id/nav_feature1" 
      android:icon="@drawable/ic_menu_camera" 
      android:checkable="true" 
      android:title="Feature 1"/> 
     <item android:id="@+id/nav_feature2" 
      android:icon="@drawable/ic_menu_gallery" 
      android:checkable="true" 
      android:title="Feature 2"/> 
     <item android:id="@+id/nav_feature3" 
      android:icon="@drawable/ic_menu_slideshow" 
      android:checkable="true" 
      android:title="Feature 3"/> 
    </group> 
    <item android:title="Select Project"> 
     <menu> 
      <group 
       android:id="@+id/group_projects"> 
       <item android:id="@+id/nav_project1" 
        android:icon="@drawable/ic_menu_manage" 
        android:checkable="true" 
        android:title="Project 1"/> 
       <item android:id="@+id/nav_project2" 
        android:icon="@drawable/ic_menu_share" 
        android:checkable="true" 
        android:title="Project 2"/> 
       <item android:id="@+id/nav_project3" 
        android:icon="@drawable/ic_menu_send" 
        android:checkable="true" 
        android:title="Project 3"/> 
      </group> 
     </menu> 
    </item> 
</menu> 

我希望,它有助于

+0

望着bug报告,他们并不完全是这样。你认为我应该提交NavigationView类的功能请求吗? –

+0

@MarcM。好吧..总是值得去尝试,但不要太投入太多的希望 - 从我的经验来看,他们的反应并不敏捷(尽管考虑到他们获得的请求的数量 - 这是可以理解的) –

+0

另外,从来没有说过,但很好的答案。万分感谢,工作顺利,工作顺利,相当干净。 –