NavigationDrawer (NavigationView) має три варіанти конфігурації позначених / вибраних елементів.
app:itemIconTint="@color/menu_text_color"
app:itemTextColor="@color/menu_text_color"
app:itemBackground="@drawable/menu_background_color"
Значок і колір тексту
Перші два варіанти (піктограма та текст) потребують ресурсу списку кольорів - https://developer.android.com/guide/topics/resources/color-list-resource.html .
Такий menu_text_color
ресурс потрібно створити у кольорі res / color . Цей вміст файлу повинен виглядати приблизно так:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorWhite" android:state_checked="true" />
<item android:color="@color/colorBlack" android:state_checked="false"/>
</selector>
@color/colorWhite
- кольоровий ресурс, що використовується для позначеного елемента
@color/colorBlack
- кольоровий ресурс, що використовується для непозначеного елемента
Я створив один ресурс для обох, але можна створити два окремі файли - один для тексту, один для значка.
Фон (itemBackground)
Для фонового варіанту потрібен ресурс, який можна малювати замість кольору, кожна спроба встановити колір закінчується виключенням. Ресурс, який можна малювати, потрібно створити в res / drawable, а його вміст повинен виглядати приблизно так:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" android:state_checked="false"/>
<item android:drawable="@color/colorPrimary" android:state_checked="true"/>
</selector>
Немає необхідності створювати будь-які малюнки, що імітують колір (в інших рішеннях я бачив такі пропозиції - можливо, для старшої версії sdk), колір можна використовувати безпосередньо у цьому файлі. У цьому прикладі файлу я використовую прозорий колір для неперевіреного елемента та colorPrimary
для позначеного елемента.
Усунення несправностей та важливі примітки
- У фоновому ресурсі завжди використовуйте state_ checked = "false" замість типового, із кольором за замовчуванням це не буде працювати
- Для динамічного / програмно створеного меню не забудьте встановити пункти як перевіряються :
Приклад коду (додавання динамічного пункту меню):
menu.add(group_id, item_id, Menu.NONE, item_name).setCheckable(true).setChecked(false);
Якщо елементи не будуть встановлені як перевіряються, тоді фон не працюватиме (дивовижний колір тексту та піктограм працюватиме, як очікувалося).