2015-07-02 47 views
2

我試圖做一個NavigationView無法更改子作品圖標NavigationView

由於無子複選框行爲(所有頂級菜單項),我可以使用下面的代碼簡單地更改圖標:

mNavigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        Boolean boolObj = mMenuToggleMap.get(menuItem.getItemId()); 
        boolean state = boolObj == null ? true : boolObj.booleanValue(); 
        state = !state; 
        if(state) menuItem.setIcon(R.drawable.btn_check_off_holo_light); 
        else  menuItem.setIcon(R.drawable.btn_check_on_holo_light); 
        mMenuToggleMap.put(menuItem.getItemId(), state); 
        return true; 
       } 
      }); 

menu.xml文件:

 <item 
      android:id="@+id/books" 
      android:title="@string/books" 
      android:icon="@drawable/btn_check_off_holo_light" 
      app:showAsAction="always"/> 

     <item 
      android:id="@+id/cddvds" 
      android:icon="@drawable/btn_check_off_holo_light" 
      android:title="@string/cddvds" 
      app:showAsAction="always"/> 

正如你可以看到:

enter image description here

然而,當我改變我的XML像這樣:

<item 
    android:id="@+id/categorySubHeader" 
    android:title="@string/categories"> 
    <menu> 
     <item 
      android:id="@+id/books" 
      android:title="@string/books" 
      android:icon="@drawable/btn_check_off_holo_light" 
      app:showAsAction="always"/> 

     <item 
      android:id="@+id/cddvds" 
      android:icon="@drawable/btn_check_off_holo_light" 
      android:title="@string/cddvds" 
      app:showAsAction="always"/> 

我發現圖標不再變化(即使在聽者的代碼仍然被調用)。任何人都可以給我一個線索,爲什麼這些項目不更新?

我想知道是否可以在NavigationView上調用invalidateMenuOptions()或可以在支持數據上調用notifyDataSetChanged()功能?

+0

檢查我更新的答案。如果我不遲到.. lolzz – Moinkhan

+0

編輯答案與子項目一起工作.. – Moinkhan

回答

1

首先確保你的兩個項目不應該是子項目。因爲我也面臨改變子項圖標工作不正常的問題。

所以你的XML應該看起來像。

<menu 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" 
    tools:context="ng.edu.binghamuni.bhu.ui.activity.HomeActivity"> 

    <item 
      android:id="@+id/books" 
      android:title="@string/books" 
      android:icon="@drawable/btn_check_off_holo_light" 
      app:showAsAction="always"/> 

     <item 
      android:id="@+id/cddvds" 
      android:icon="@drawable/btn_check_off_holo_light" 
      android:title="@string/cddvds" 
      app:showAsAction="always"/> 

</menu> 

在您的導航點擊執行以下代碼。

navView.setNavigationItemSelectedListener(
    new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 
      switch (menuItem.getItemId()) { 
       case R.id.books: 
        menuItem.setIcon((isBookChecked)?R.drawable.btn_check_off_holo_light:R.drawable.btn_check_on_holo_light); 
        isBookChecked = !isBookChecked; 
        break; 
       case R.id.cddvds: 
        menuItem.setIcon((isCdDVDChecked)?R.drawable.btn_check_off_holo_light:R.drawable.btn_check_on_holo_light); 
        isCdDVDChecked = !isCdDVDChecked; 
        break; 
      } 
      return true; 
     } 
    }); 

只需創建兩個變量isBookCheckedisCdDVDChecked全球範圍內manully保持選中狀態。

[更新------------------- /////]

我花了一些時間變化的分項的圖標。 終於我做到了。但目前這是棘手的解決方案。 在一個月前,我已經報告了一個bug: https://code.google.com/p/android/issues/detail?id=176300,那我們無法在導航視圖中添加動態菜單。我認爲這也是該錯誤的鏈條(更新用戶界面問題)。

所以,對於解決Actully當我們使用setIcon()來改變方法的圖標下面做你的導航點擊..

navView.setNavigationItemSelectedListener(
    new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 

      // change the icon as you need 
      menuItem.setIcon(getResources().getDrawable(android.R.drawable.checkbox_on_background)); 

      // here is the trick. Resetting the title of top level item. 
      navView.getMenu().getItem(0).setTitle(navView.getMenu().getItem(0).getTitle()); 
      return true; 
     } 
    }); 

。該圖標正在改變,但問題是它不會更新UI。 因此,重置頂級項目的標題將更新UI。我希望對你有幫助。

+0

感謝您的答案!正如我所說的,如果項目是頂級項目(如您的示例中所示),則可以正常工作。當項目子項(它們是嵌套在另一個項目中像

)我只發現一個問題。現階段,整個集合似乎都是一個響應 - 這是我需要的功能。 – Graeme

+0

那麼它是由一個bug造成的呢?我已經看到了一些解決方法,其中涉及通過反射找到「通知」方法並調用該方法,但必須切換到手動方法,而不是使用這些內置圖標。 – Graeme

+1

是的,這是一個錯誤...並且該錯誤已解決並標記爲將來的版本。所以我們這將不會發生在未來的圖書館。但現在你可以申請我的棘手的解決方案.. – Moinkhan