2015-06-11 29 views
6

我最近开始转换我的Android应用程序,使用最新的支持库称为支持:设计。Android支持:设计NavigationView检查菜单子项

在实现新的NavigationView时,我偶然发现了显示所选菜单项的问题。

我navdrawer_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
</group> 

    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</menu> 

接下来我将在我的onNavigationItemSelected检查菜单的项目:

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 

    menuItem.setChecked(true); 

    drawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      displayView(menuItem.getItemId()); 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 
    return true; 
} 

这个伟大的工程,如果我只用标签之间的正常的菜单项,但它确实副标题不能很好地工作。点击子项不会设置它们检查,直到我点击了同一个项目两次,它不会取消选中以前检查过的任何项目。

它结束了看起来像这样:

enter image description here

+0

这是一个Android支持库的bug:https://code.google.com/p/android/issues/detail?id=175216 – sromku

回答

3

我以这种方式工作得非常好地解决了这个问题复发。

我们必须简单地记住所选项目的ID,在您的NavigationView上重新填充菜单并再次选择该项目。

对于您需要在您的菜单抽屉状方式:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/section_1" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
     ... 
    <item 
     android:id="@+id/section_x" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
</menu> 

所以,我的解决办法:

public class YourActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

... 
private NavigationView mNavigationView; 
private int mNavItemId; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 

    // load saved navigation state if present 
    if (null == savedInstanceState) { 
     mNavItemId = R.id.item_1_section_1; 
    } else { 
     mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID); 
    } 

    // listen for navigation events 
    mNavigationView = (NavigationView) findViewById(R.id.navigation_view); 
    mNavigationView.setNavigationItemSelectedListener(this); 

    // select the correct nav menu item 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 
} 

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 
    // update highlighted item in the navigation menu 
    mNavItemId = menuItem.getItemId(); 

    // allow some time after closing the drawer before performing real navigation 
    // so the user can see what is happening 
    mDrawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      ... 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 

    // Reload menuDrawer to keep selected item 
    mNavigationView.getMenu().clear(); 
    mNavigationView.inflateMenu(R.menu.menu_drawer); 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 

    return true; 
} 

... 

} 
+0

这似乎是做的工作,但是当我这样做,它只会加载第一组菜单。有任何想法吗? – orelzion

7

每个项目必须是一个组里面,所以该组可以控制项目的用户选择时的视觉行为。试试看:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</group> 
</menu> 
+0

@JohnVandenBerg如果这个或任何答案已经解决了您的问题,请点击复选标记,考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – Sufian

3

很简单。 只需添加android:checkable =“true”为每个项目。

例如。

<item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" 
     android:checkable="true" /> 
1

我建议采用@MichelFortes提供的解决方案,因为它解决了NavigationView中子菜单项的问题。这是我的代码和它的作品

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/your_id_item" 
     android:icon="@drawable/your_icon_if_you_want" 
     android:title="@string/title_for_this_item" /> 

    <!-- you can add here as many items as you want --> 

</group> 

<item 
    android:title="@string/submenu_title"> 
    <menu> 
     <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/submenu_item_id" 
       android:icon="@drawable/icon_if_exists" 
       android:title="@string/title_for_item" /> 

      <!-- you can add here as many items as you want --> 

     </group> 
    </menu> 
</item> 

在这里,你选择的每个项目,将进行检查和突出! 再次感谢@MichelFortes;)