Значок элемента панели навигации не показывает исходный цвет

140

Я пытаюсь показать значок рядом с элементом в моем меню для панели навигации, но по какой-то причине значок всегда отображается серым, а не исходным цветом (коричневым). Есть ли способ предотвратить это, чтобы показать исходный цвет значка?

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        if (navigationView != null) {
            setupDrawerContent(navigationView);
        }
    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();

                return true;
            }
        });
    }
}

drawer_view.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Section">
        <menu>
            <item
                android:id="@+id/navigation_item_1"
                android:icon="@drawable/ic_browncircle"
                android:title="Sub item 1" />
        </menu>
    </item>
</menu>

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

MacaronLover
источник
Что в твоем ic_browncircle?
Йе Лин Аунг
@YeLinAung Коричневый кружок, как и значок выше рядом с «Подпунктом 1», но коричневого, а не серого цвета.
MacaronLover
Может быть, вы можете попробовать .setColorFilter(MY_BROWN_COLOR)эту точку зрения?
Е Лин Аунг
Пожалуйста, посмотрите мой ответ ниже.
Е Лин Аунг

Ответы:

354

Я нашел ответ здесь: https://stackoverflow.com/a/30632980/875249

Чтобы избежать ссылки, довольно просто:

    mNavigationView.setItemIconTintList(null);

Это отключает все тонирование на основе состояний, но вы также можете указать свой собственный список. У меня это сработало!

Здесь вы можете получить подробную информацию о создании списка состояний цвета, но это тоже довольно просто: http://developer.android.com/reference/android/content/res/ColorStateList.html

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true" android:color="@color/primary" />
        <item android:state_checked="false" android:color="@android:color/white" />
    </selector>
Крис
источник
Да, я тестировал его на Nexus 4 с API 17. Я также тестировал предварительную версию Android M. ColorStateList существует уже некоторое время, а NavigationView является частью библиотеки поддержки, поэтому я не вижу причин, по которым это не сработало бы до ICS и, возможно, даже дальше.
Крис
11
Любая альтернатива XML для этого? Пробовали, app:itemIconTint="@null"но безуспешно.
Mangesh
Спасибо, у меня начала
болеть
4
mNavigationView.setItemIconTintList(null);Это ответ, который я так долго искал ...
Джахид
1
Где вы используете селектор?
John Sardinha,
49

Использовать

    mNavigationView.setItemIconTintList(null);

это правильно. Также, если все ваши значки в одной цветовой схеме (у меня все были белые), вы можете настроить через файл xml - app: itemIconTint = "@ android: color / white"

Мое дело:

<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:clickable="true"
    app:headerLayout="@layout/nav_header_main"
    app:itemTextColor="@android:color/white"
    app:menu="@menu/activity_main_drawer"
    android:background="@android:color/black"
    app:itemIconTint="@android:color/white"
    />
Чак
источник
Вы знаете, как решить эту другую проблему?
MacaronLover
Этот работает хорошо, mNavigationView.setItemIconTintList(null);удаляет iconTint по умолчанию из всех значков. Теперь, если у вас есть значок красного цвета, он будет красным, а iconTint не будет применен.
Сайед Хиссаан
5

Я пробовал нечто подобное в одном из своих приложений. И да, похоже, цвет значка не меняется. Но мне удалось найти другое решение. Вот мойic_browncircle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:tint="@color/brown"
    >
  <size
      android:height="3dp"
      android:width="3dp"
      />
  <solid android:color="@color/brown"/>
</shape>

Я считаю, что это похоже на вас, но не имеет никакого эффекта и не меняет цвет.

Я сделал вот что.

navigationView.getMenu()
    .findItem(R.id. navigation_item_1)
    .getIcon()
    .setColorFilter(Color.parseColor("#b69260"), PorterDuff.Mode.SRC_ATOP);

И вроде работает. Вот результат.

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

Е Лин Аунг
источник
А что насчет pre-Lollipop?
MacaronLover
Я пробовал несколько решений для pre-Lollipop. Пока не повезло :(
Е Лин Аунг
4

Если вы создаете проект с навигационным ящиком, который Android Studioпредоставлен. В своем классе Main Activity вы можете просто добавить эту строку кода navigationView.setItemIconTintList(null);в свой onCreateметод. Как это;

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);
 navigationView.setItemIconTintList(null); // <----- HERE
 setupDrawerContent(navigationView);
Дэвид Адам
источник
3

Вы можете попробовать использовать тонированную вытяжку, не уверен, что она работает ниже 5.0.

Создайте чертеж и добавьте следующий код.

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_browncircle"
    android:tint="@color/brownColor"/>

А затем измените свой пункт меню на тот, который вы только что создали. Если это не сработает, я не уверен в других решениях. Вы можете попробовать эту библиотеку: https://github.com/mikepenz/MaterialDrawer Я часто использую ее в своих проектах.

Остин Ходак
источник
Этот метод не работает с API 17 (4.2). Причина (по крайней мере, по моему опыту) в том, что панель навигации автоматически накладывает белый значок с черным оттенком, когда ваша тема настроена на свет. Когда я убираю свет со своей темы, мои значки становятся белыми, как я и предполагал.
Крис
2

Просто добавьте одну строку в xml

app:itemIconTint="@color/white"

Харш Сингхал
источник
Илиapp:itemIconTint="@null"
Влад
1

Каким-то образом этот код не работает MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

так что вы можете использовать это.

MainActivity.java

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
   navigationView.setNavigationItemSelectedListener(this); 
   navigationView.setItemIconTintList(null); // <-- HERE add this code for icon color
Парбан
источник
0

Добавь это

 android:tint="@color/colorPrimary"
исключение нулевого указателя
источник
0

Я нашел решение.

1) Перейдите на вкладку Дизайн
2) Нажмите на navView
3) Найдите элемент в свойствах
4) Напишите nullи нажмитеEnter

Идрис Хан
источник