Селекторы представления навигации ведут себя неправильно

Я следую этой цветовой схеме представления навигации. введите здесь описание изображения

Я создал 3 селектора для фона, текста и значка. Когда я установил селекторы, мой вид навигации выглядел так: введите здесь описание изображения

Проблема в том, что ни один элемент не выбран, и если я нажму один элемент, цвет фона всех элементов изменится на серый. Значок никогда не получает основной цвет.

Вот XML:

 <android.support.design.widget.NavigationView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@android:color/white"
            app:itemTextColor="@drawable/nav_item_text"
            app:itemIconTint="@drawable/nav_item_icon_tint"
            app:itemBackground="@drawable/nav_item_background"
            app:headerLayout="@layout/drawer_student_data_header"
            app:menu="@menu/drawer"
            android:id="@+id/navigationView"/>

nav_item_icon_tint.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/gray_600"/>
    <item android:state_selected="true" android:color="@color/primary" />
    <item android:color="@color/gray_600" />
</selector>

nav_item_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/black_87_percent"/>
    <item android:state_selected="true" android:color="@color/primary" />
    <item android:color="@color/black_87_percent" />
</selector>

nav_item_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/gray_400"/>
    <item android:state_selected="true" android:drawable="@color/gray_200" />
    <item android:drawable="@android:color/white" />
</selector>

person dgzz    schedule 16.10.2015    source источник


Ответы (3)


У меня была похожая проблема, и похоже, что способ ее решения - использовать android:state_checked вместо android:state_selected во всех трех селекторах (по крайней мере, это решило это для меня).

person Ireneusz    schedule 02.01.2016

Вы можете использовать setItemTextColor и setItemIconTintList для установки оттенка цвета текста и оттенка цвета значка для элемента NavigationDrawer,

Чтобы использовать эти методы, добавьте этот код в конец onCreateView:

 int[][] states = new int[][]{
        new int[]{-android.R.attr.state_checked},// unchecked state
        new int[]{android.R.attr.state_checked}, // checked state
};

int[] colors = new int[]{
        ContextCompat.getColor(this, R.color.colorPrimary),
        ContextCompat.getColor(this, R.color.colorPrimaryDark)
};

ColorStateList colorStateList = new ColorStateList(states, colors);
navigationView.setItemTextColor(colorStateList);
navigationView.setItemIconTintList(colorStateList);

Этот код устанавливает цвет в непроверенное и проверенное состояние. Вы можете установить цвет в другие состояния.

Массив цветов и массив состояний должны иметь одинаковое количество элементов. Вы можете выбрать цвет, какой хотите. Вы можете использовать класс Color или использовать ресурс примера. По этой ссылке вы можете найти список доступных состояний developer.android.

person Fred    schedule 04.01.2016

Убедитесь, что вы не получаете доступ к элементу меню из нижней навигации и дважды не устанавливаете его состояние «отмечено». Чтобы этого избежать, используйте:

mBottomNavigationView.selectedItemId(R.id.your_menu_item_id);

вместо

mBottomNavigationView.menu.getItem(position).setChecked(true);
person Andre Haueisen    schedule 01.05.2017