2016-10-26 5 views
0

Я пытаюсь изменить значки пунктов меню в своем навигационном представлении, когда их нажимают. Для этого я использую следующий метод:Android NavigationView Проблемы с изображением меню

private void selectDrawerItem(final MenuItem menuItem){ 

    for (int i = 0; i < navigationView.getMenu().size(); i++){ 
     Log.e(TAG, "Clearing " + navigationView.getMenu().getItem(i).getItemId() + " " + navigationView.getMenu().getItem(i).getIcon()); 
     navigationView.getMenu().getItem(i).getIcon().setTint(ContextCompat.getColor(this, R.color.white)); 
    } 

    switch (menuItem.getItemId()){ 
     default: 
      break; 

     case R.id.drawer_item_one: 
      menuItem.getIcon().setTint(ContextCompat.getColor(this, R.color.accent)); 
      Log.e(TAG, "Setting " + menuItem.getItemId() + " " + menuItem.getIcon()); 
      break; 
    } 

    Log.e(TAG, "-----END-----"); 

    menuItem.setChecked(true); 
    //drawerLayout.closeDrawers(); 
} 

Проблема заключается в том, что всякий раз, когда я нажимаю на первый элемент, он правильно сбрасывает все иконки на белый, но затем он устанавливает выбранный значок в цветовой акцент, а также предыдущие 2 пункта меню, которые я нажал. Я не понимаю, что происходит. Журналы ясно показывают, что он только устанавливает цвет фона один раз, так почему 3 из них получают набор?

Кажется, что любой элемент ящика, который я добавляю в оператор switch, заставляет предыдущие 3 элемента также изменять цвета фона. Что происходит?

EDIT

Если я заменить код в операторе переключателя, а просто добавить задержку, кажется, работает:

case R.id.drawer_item_one: 
      new Handler(getMainLooper()).postDelayed(new Runnable(){ 
       @Override 
       public void run(){ 
        menuItem.getIcon().setTint(ContextCompat.getColor(context, R.color.primary_dark)); 
       } 
      }, 50); 
      break; 

Я не хочу, чтобы добавить задержку, хотя, как я могу сделать эту работу без странного обходного пути?

EDIT 2

Другое дело, я заметил, что, если вместо того, чтобы изменить цвет, я изменить текст заголовка, он отлично работает.

ответ

0
<android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="@dimen/nav_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:itemIconTint="@drawable/navigation_selected_item" 
     app:itemTextColor="@drawable/navigation_selected_item" 
     app:menu="@menu/drawer" /> 

---------------------------------------------------------------- 
navigation_selected_item.xml 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- This is used when the Navigation Item is checked --> 
    <item android:color="@color/selected_color" android:state_checked="true" /> 
    <!-- This is the default text color --> 
    <item android:color="@color/default_color" /> 
</selector> 
+0

Я пытаюсь иметь другой цвет, выбранный для каждого элемента таким образом, это не будет работать – TychoTheTaco

0

см ссылку ниже для добавления другого цвета для каждого пункта меню. How to give color to menu items for Navigation drawer?

+0

Я пытаюсь сделать номер 3 в связанном ответ, но, кажется, что 'getIcon()' возвращает в 'GradientDrawable' вместо «BitmapDrawable», поэтому код не работает. Есть ли способ, который я мог бы преобразовать? – TychoTheTaco

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