2015-06-11 54 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;)