Динамическое изменение цвета элемента представления навигации Android

Я хотел бы создать навигационный ящик, в котором каждый элемент имеет другой цвет выбора (оттенок значка и цвет текста), как в магазине Google Play:

введите здесь описание изображения

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


person vigonotion    schedule 21.06.2015    source источник
comment
Возможно, они не использовали NavigationView, так как это было в приложении до библиотеки поддержки дизайна (если я правильно помню). Я думаю, что вы сами воссоздаете вид, чтобы добиться этого эффекта.   -  person Longi    schedule 21.06.2015
comment
@Том. вы получили решение, вы, кажется, приняли ответ, но он не работает для меня.   -  person Parth Anjaria    schedule 02.03.2016


Ответы (5)


используйте app:itemIconTint в NavigationView для значков и используйте app:itemTextColor для textColors

Образец:

drawable/navigation_text_color :

<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>

и layout :

<android.support.design.widget.NavigationView
       .
       .
       app:itemTextColor="@drawable/navigation_text_color"/>
person DJafari    schedule 22.06.2015
comment
спасибо, теперь я меняю ColorStateList каждый раз, когда щелкают элемент меню. - person vigonotion; 22.06.2015
comment
Куда бы вы поместили этот XML-фрагмент селектора? Также app:itemTextColor изменяет цвет всех значков. Есть ли способ изменить цвет только одного значка? Спасибо! - person justinrixx; 22.06.2015
comment
@justinrixx Я меняю его каждый раз, когда элемент выбирается с помощью следующего кода Java: jsfiddle.net/a2j7jayo - person vigonotion; 22.06.2015
comment
@justinrixx нет, в концепциях дизайна материалов, в представлении навигации все значки должны быть одного цвета. - person DJafari; 22.06.2015
comment
@D.A.V.O.O.D, так ты, например, не пользуешься почтой? Некоторые значки имеют разные цвета, даже если они не отмечены флажком. Я думаю, это то, чего хотят достичь justinrixx (и я тоже). - person Mino; 12.11.2015
comment
у кого-нибудь есть ответ на это? я столкнулся с той же проблемой? - person Parth Anjaria; 02.03.2016
comment
@ParthAnjaria, какая проблема? - person DJafari; 02.03.2016
comment
я не смог изменить цвет, но позже я получил решение, я добавил свое решение, которое работает для меня - person Parth Anjaria; 02.03.2016
comment
@ParthAnjaria ваш ответ меняет весь цветАкцент темы! этот ответ работает, я обновил ответ, чтобы лучше знать - person DJafari; 03.03.2016
comment
Я поместил этот файл в res/color. Также вы можете определить app:itemIconTint для значков. - person CoolMind; 02.08.2016

Если динамически вы имеете в виду программно, вы можете попробовать это:

// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] states = new int[][]{
        new int[]{-android.R.attr.state_checked},  // unchecked
        new int[]{android.R.attr.state_checked},   // checked
        new int[]{}                                // default
};

// Fill in color corresponding to state defined in state
int[] colors = new int[]{
        Color.parseColor("#747474"),
        Color.parseColor("#007f42"),
        Color.parseColor("#747474"),
};

ColorStateList navigationViewColorStateList = new ColorStateList(states, colors);

// apply to text color
navigationView.setItemTextColor(navigationViewColorStateList);

// apply to icon color
navigationView.setItemIconTintList(navigationViewColorStateList);

Таким образом, вы можете определить несколько цветов для разных настроек, таких как «День» или «Ночь».

person Robert    schedule 26.03.2016

Finllay я получил ответ,

Вы должны изменить colorAccent в файле цветов на любой цвет, который вы хотите:

  <color name="colorAccent">whichever color required</color>

Это решение сработало для меня

person Parth Anjaria    schedule 02.03.2016

    <android.support.design.widget.NavigationView
           .
           .
           app:itemIconTint="@color/your_selector_file_name" // for Icon
        app:itemTextColor="@color/your_selector_file_name" // for text
/>

Добавление к тому, что сказал @DAVOOD. Приведенный ниже селектор цвета сработал для меня.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- This is used when the Navigation Item is checked -->
        <item android:color="@color/tenoBrandColor" android:state_pressed="true" />
        <!-- This is the default text color -->
        <item android:color="@color/textprimary" />
</selector>
person Sagar Devanga    schedule 27.07.2017

Для ленивых есть более простой вариант.

TL;DR: Просто создайте новый style с colorPrimary желаемым цветом, а затем установите theme NavigationView в качестве нового style.

Просто создайте новый style как:

<style name="AppTheme.NoActionBar.NavigationView">
    <item name="colorPrimary">@color/myDesiredColor</item>
</style>

Этот style автоматически унаследуется от вашего базового theme (в моем случае это был AppTheme.NoActionBar), а затем вам просто нужно установить colorPrimary желаемого цвета.

Тогда вам просто нужно установить theme NavigationView как:

android:theme="@style/AppTheme.NoActionBar.NavigationView"

in:

<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:headerLayout="@layout/nav_header_menu_test"
    app:menu="@menu/main_drawer"
    android:theme="@style/AppTheme.NoActionBar.NavigationView" /> 
person Michel Feinstein    schedule 26.10.2017