Intereting Posts

Как настроить цвет фона элемента и цвета текста внутри NavigationView?

Я хочу добиться чего-то подобного в документах Material Design Docs .

colorControlHighlight используется для фона для отмеченных элементов.

Мне нужно настроить:

  • Фон не установлен
  • Цвет текста
  • Цвет текста не установлен

Solutions Collecting From Web of "Как настроить цвет фона элемента и цвета текста внутри NavigationView?"

NavigationDrawer (NavigationView) имеет три варианта настройки отмеченных / выбранных элементов.

 app:itemIconTint="@color/menu_text_color" //icon color app:itemTextColor="@color/menu_text_color" //text color app:itemBackground="@drawable/menu_background_color" //background 

Значок и цвет текста

Первые два варианта (значок и текст) нуждаются в ресурсе списка состояний цветаhttps://developer.android.com/guide/topics/resources/color-list-resource.html .

Такой ресурс menu_text_color необходимо создать в res / color . Содержимое этого файла должно выглядеть примерно так:

 <!-- res/color/menu_text_color.xml --> <?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, а его содержимое должно выглядеть примерно так:

 <!-- res/drawable/menu_background_color.xml --> <?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); 

Если элементы не будут установлены как проверяемые, то фон не будет работать (цвет текста и значков будет работать, как ожидалось).

itemBackground , itemIconTint и itemTextColor – это простые xml-атрибуты, которые могут быть установлены, хотя вы должны использовать пользовательский префикс вместо android: один.

пример

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- Other layout views --> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:itemBackground="@drawable/my_ripple" app:itemIconTint="#2196f3" app:itemTextColor="#009688" app:headerLayout="@layout/nav_header" app:menu="@menu/drawer_view" /> </android.support.v4.widget.DrawerLayout> 

Примечание. В этом случае цвет текста, оттенок значка и фон являются статическими. Если вы хотите изменить цвет текста (например, розовый, если его не ColorStateList и ColorStateList если вы его ColorStateList ), вы должны использовать ColorStateList .

пример

Создайте новый * .xml-файл в /res/color – назовите его state_list.xml – со следующим содержимым:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- This is used when the Navigation Item is checked --> <item android:color="#009688" android:state_checked="true" /> <!-- This is the default text color --> <item android:color="#E91E63" /> </selector> 

А затем просто app:itemTextColor="@color/state_list" него следующим образом: app:itemTextColor="@color/state_list"

То же самое касается itemIconTint . itemBackground ожидает идентификатор ресурса. См. Также документы .

Использование colorControlHighlight – хорошее решение для меня. Помните, что в последней библиотеке поддержки вы можете определить тему (а не только стиль) для каждого виджета; Например, вы можете определить colorControlHighlight в теме NavigationView, и это не будет применяться к остальным виджетам.

Теперь в режиме навигации вы также можете просмотреть свой собственный вид. С новым appcompat-v7:23.1.0 вы можете

Установить пользовательские представления для элементов через приложение: actionLayout или с помощью MenuItemCompat.setActionView ().

 View view = View.inflate(context, R.layout.your_custom_nav_layout_item, null); MenuItemCompat.setActionView(menuItem, view); 

Таким образом, вы можете создать свой собственный макет с помощью TextView и изменить backgrounds/colors/fonts вы хотите. Надеюсь, это было полезно 🙂 Источник

Вы можете программно использовать этот код:

 int[][] states = new int[][] { new int[] { android.R.attr.state_enabled}, // enabled new int[] {-android.R.attr.state_enabled}, // disabled new int[] {-android.R.attr.state_checked}, // unchecked new int[] { android.R.attr.state_pressed} // pressed }; int[] colors = new int[] { Color.BLACK, Color.RED, Color.GREEN, Color.BLUE }; ColorStateList myList = new ColorStateList(states, colors); nav_view.setItemIconTintList(myList); 

Вы можете сделать это, используя следующий оператор:

 navigationView.setItemBackground(ContextCompat.getDrawable(CustomerHomeActivity.this, R.color.transparent));