NavigationView различные itemTextColor

306
26 ноября 2016, 19:15

Имеется NavigationView в котором подключаю menu c items.

Можно ли как то задать что бы цвет например первого элемента был белый, а второго синий?

Т.е. не при нажатии а статически цвета items были разные.

NavigationView.xml:

<android.support.design.widget.NavigationView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:id="@+id/navigation_view"
    app:menu="@menu/navigation_items"
    app:itemTextColor="@color/my_text_color"> 

Меню:

<menu>
    <item
    android:id="@+id/my_id1"
    android:title="Элемент1"/> 
    <item
    android:id="@+id/my_id2"
    android:title="Элемент2"/>
</menu>
Answer 1

Я согласен с @ЮрийСПб абсолютно, просто предложу грязный и менее грязный хак, эту мысль можно развить, вот примеры:

Пример-1:

Находим NavigationView , вытаскиваем Menu потом нужный Item, и красим в коде сам текст. Можно через UTF-16 сделать кстати я никогда такого не пробовал, уверен что можно, в целом мысль ясна.

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.getMenu().getItem(1).setTitle(Html.fromHtml("<font color='#fff'>NotLikeAll</font>"));

Пример-2:

Находим NavigationView, из Menu вытаскиваем нужный MenuItem (второй), используем класс SpannableString и метод setSpan, он ждет Object. Скармливаем ему ForegroundColorSpan и это более лояльно, ибо он расширен CharStyle, который имеет Paint для раскраски, поэтому обратная генерация кода в UTF-16 будет на сознании AndroidSDK, и от этого вроде легче, ну чуть чуть... наверно..)

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
MenuItem item_1 = navigationView.getMenu().getItem(1);
SpannableString s = new SpannableString(item_1.getTitle());
s.setSpan(new ForegroundColorSpan(Color.GREEN), 0, s.length(), 0);
item_1.setTitle(s);

Answer 2

Простого способа из коробки нет. Вы можете задать только значения для всех элементов сразу.

Придётся программно брать каждый элемент в onPrepareOptionsMenu по их ID и назначать там.

Плюс попробуйте посмотреть тут. Говорят, что можно собственную разметку для каждого элемента назначить - так будет ещё больше контроля. Но кода всё одно будет порядочно.

Answer 3

Долго искал способ динамически подменивать цвет текста (и иконок), в зависимости от темы. Сейчас использую такой способ сразу для всех пунктов. Ничего не мешает использовать его и по-штучно. Из преимуществ - сразу задаем любой цвет для любого состояния (нажато/выделено/выбрано/неактивно).

     int[][] states = new int[][]{
            new int[]{-android.R.attr.state_checked}, // default
            new int[]{android.R.attr.state_checked}  // checked
    };
    int[] colors = new int[]{
            AppConst.color_text_small,
            AppConst.color_accent
    };
    ColorStateList color_menu_item = new ColorStateList(states, colors);
    navigationView.setItemTextColor(color_menu_item);
    navigationView.setItemIconTintList(color_menu_item);
READ ALSO
Что не так с выводом массива? [дубликат]

Что не так с выводом массива? [дубликат]

На данный вопрос уже ответили:

305
Можно ли применять в Map двойной ключ?

Можно ли применять в Map двойной ключ?

Например, Map<String*, Integer> map = new TreeMap<String, Integer>();, там где * можно поставить < <String,String>, Integer > например?

319
как скрыть окно ошибки Winrar в Java

как скрыть окно ошибки Winrar в Java

Есть класс Java, который распаковывает архивы в каталогеЕсли архив поврежден, то открывается окно winrar с содержимым "Архив поврежден или имеет...

268
Что за методы removeAll и retainAll?

Что за методы removeAll и retainAll?

В гугле наткнулся на только такое описание:

833