Android NavigationView setBackgroundTintList не работает

Я хочу установить цвет и фон выбранных элементов в NavigationDrawer. Он отлично работает с текстом и значками, но не с фоном выбранного элемента.

ColorStateList textColors = new ColorStateList(
                new int[][]{
                        new int[]{ -android.R.attr.state_checked }, // unchecked
                        new int[]{ android.R.attr.state_checked }  // checked
                },
                new int[]{
                        getResources().getColor(R.color.menu_text_color),
                        getResources().getColor(R.color.md_black_1000)
                }
        );
 navigationView.setItemTextColor(textColors);
 navigationView.setItemIconTintList(textColors);

Но когда я хочу, чтобы фон менялся таким же образом, состояние CHECKED не работает, только непроверенное состояние...

  ColorStateList backgroundColors = new ColorStateList(
                new int[][]{
                        new int[]{ -android.R.attr.state_checked }, // unchecked
                        new int[]{ android.R.attr.state_checked } // checked
                },
                new int[]{
                        getResources().getColor(R.color.md_grey_400),
                        getResources().getColor(R.color.md_grey_700)
                }
        );

 navigationView.setBackgroundTintList(backgroundColors);


 navigationView.getMenu().findItem(/* menuitem id */).setChecked(true);

Как я могу установить фон пункта меню отмеченного состояния, например цвет текста и значка?


comment
проверьте это --› github.com/andremion/Floating-Navigation-View /pull/6/файлы   -  person Wini    schedule 02.03.2020
comment
Это устанавливает весь фон навигационного представления... Я хочу установить ТОЛЬКО проверенный фон MenuItems, поэтому я хотел, чтобы этот проверенный и непроверенный подход, например, с текстом и значками   -  person CookieMonster    schedule 02.03.2020


Ответы (1)


Вы должны использовать атрибут itemShapeFillColor в макете или стиле.

Что-то типа:

<com.google.android.material.navigation.NavigationView
    app:itemShapeFillColor="@color/..."
    ../>

или используйте собственный стиль:

<style name="..." parent="Widget.MaterialComponents.NavigationView" >
   <item name="itemShapeFillColor">@color/....</item>
</style>

Это селектор по умолчанию:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:alpha="0.12" android:color="?attr/colorPrimary" android:state_activated="true"/>
  <item android:alpha="0.12" android:color="?attr/colorPrimary" android:state_checked="true"/>
  <item android:color="@android:color/transparent"/>
</selector>

Обратите внимание на использование itemBackground.
Для него установлено значение @null, чтобы использовать фасонный фон, программно созданный NavigationView, когда установлены itemShapeAppearance и/или itemShapeAppearanceOverlay (поведение по умолчанию).
Этот фон стилизован с использованием атрибутов itemShape* ниже. Установка itemBackground перезапишет программный фон и приведет к игнорированию значений, установленных в атрибутах itemShape*.

person Gabriele Mariotti    schedule 02.03.2020
comment
Как я могу это использовать? Я создал файл XML в drawable и установил его в itemBackground NavigationView, но он вылетает: com.google.android.material.navigation.NavigationView android:id=@+id/nav_view android:layout_width=250dp android:layout_height=match_parent android:layout_gravity=start app:headerLayout=@layout/nav_header app:itemBackground=@drawable/drawer_item_background app:menu=@menu/drawer_menu › - person CookieMonster; 02.03.2020
comment
В NavigationView нет app:itemShapeFillColor в xml :( - person CookieMonster; 02.03.2020
comment
@CookieMonster Вы должны использовать версию 1.1.0 библиотеки компонентов материалов. - person Gabriele Mariotti; 02.03.2020