2015-07-02 3 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"/> 

Я считаю, что значки больше не изменяются (даже при том, что код у слушателя еще называют). Может ли кто-нибудь дать мне понять, почему эти предметы не обновляются?

Мне интересно, можно ли вызывать invalidateMenuOptions() в NavigationView или функцию notifyDataSetChanged() для данных резервной копии?

+0

проверить мой обновленный ответ. Если я не опаздываю .. lolzz – Moinkhan

+0

Отредактированный ответ также работает с подпунктом. – Moinkhan

ответ

1

Прежде всего убедитесь, что оба элемента не должны быть подэлементом. Потому что я также сталкиваюсь с той же проблемой, что изменение значка subitem не работает должным образом.

Значит, ваш 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; 
     } 
    }); 

Просто создайте две переменных isBookChecked и isCdDVDChecked глобально для поддержания отмеченного состояния manully.

[Update ------------------- /////]

Я провел некоторое время для изменения значка подэлемента. наконец я сделал это. Но в настоящее время это сложное решение. Becuase месяц назад У меня есть сообщение об ошибке: https://code.google.com/p/android/issues/detail?id=176300, что мы не можем добавить динамическое меню в режим навигации. и я думаю, что это также цепочка этой ошибки (Update UI issue).

Таким образом, для решения сделайте следующее в навигационном клик ..

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

Actully, когда мы меняем иконку с помощью метода() SetIcon. значок меняется, но проблема в том, что он не будет обновлять пользовательский интерфейс. Таким образом, перезагрузка заголовка элемента верхнего уровня обновит UI. Надеюсь, это вам поможет.

+0

Спасибо за ответ! Как я уже сказал, отлично работает, если элементы являются элементами верхнего уровня (как в вашем примере).Я только нахожу проблему, когда элементы являются подпунктами (они вложены в другой элемент, например

). На этом этапе весь набор, кажется, отвечает как один - и это необходимая мне функциональность. – Graeme

+0

Значит, это вызвано ошибкой? Я видел какой-то ответ, который сворачивает вокруг, который включает в себя поиск метода «уведомлять» путем отражения и вызова этого, но ему пришлось переключиться на ручной подход, а не использовать эти встроенные значки. – Graeme

+1

Да, это ошибка ... и ошибка решена и помечена как будущий выпуск. Таким образом, это не произойдет в будущей библиотеке. Но на данный момент вы можете применить мое сложное решение. – Moinkhan

Смежные вопросы