Ícone do item da gaveta de navegação não mostrando a cor original

138

Estou tentando mostrar um ícone ao lado de um item no meu menu para a minha gaveta de navegação, mas por algum motivo o ícone sempre aparece em cinza e não na cor original (marrom). Existe alguma maneira de impedir que isso aconteça para mostrar a cor original do ícone?

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>

insira a descrição da imagem aqui

MacaronLover
fonte
O que há no seu ic_browncircle?
Ye Lin Aung
@YeLinAung Um círculo marrom como o ícone acima ao lado do "Subitem 1", mas na cor marrom, não cinza.
MacaronLover
Talvez você possa tentar .setColorFilter(MY_BROWN_COLOR)essa visão?
Lin Ye Aung
Por favor, veja minha resposta abaixo.
Ye Lin Aung

Respostas:

350

Encontrei a resposta aqui: https://stackoverflow.com/a/30632980/875249

Para evitar o link, é bastante direto:

    mNavigationView.setItemIconTintList(null);

Isso desativa todos os tingimentos baseados em estado, mas você também pode especificar sua própria lista. Funcionou muito bem para mim!

Aqui é onde você pode obter detalhes sobre a criação de uma lista de estados de cores, mas também é bastante simples: 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>
Chris
fonte
Sim, eu testei em uma API 17. do Nexus 4 em execução. Também testei na visualização do Android M. O ColorStateList já existe há algum tempo e o NavigationView faz parte da biblioteca de suporte, portanto não vejo uma razão pela qual isso não funcionaria até o ICS e possivelmente ainda mais para trás.
Chris
11
Alguma alternativa XML para isso? Tentei, app:itemIconTint="@null"mas sem sucesso.
Mangesh
Obrigado, eu estava começando a ficar com dor de cabeça com esta questão
wax911
4
mNavigationView.setItemIconTintList(null);Esta é a resposta que eu estava procurando por tanto tempo ...
Jahid
1
Onde você usa o seletor?
John Sardinha
49

Usar

    mNavigationView.setItemIconTintList(null);

está certo. Além disso, se todos os seus ícones em um esquema de cores (eu tinha todo branco), você pode configurar através do arquivo xml - app: itemIconTint = "@ android: color / white"

O meu caso:

<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"
    />
Mandril
fonte
Você sabe como resolver esse outro problema?
MacaronLover
Este funciona bem, mNavigationView.setItemIconTintList(null);remove o iconTint padrão de todos os ícones. Agora, se você tiver seu ícone na cor vermelha, ele parecerá vermelho, nenhuma iconTint será aplicada.
Syed Hissaan
5

Eu tentei algo semelhante em um dos meus aplicativos. E sim, parece que a cor do ícone não muda. Mas eu consegui fazer com outra solução alternativa. Aqui está o meuic_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>

O que acredito ser algo parecido com você, mas não tem efeito e não muda a cor.

Então o que eu fiz é isso.

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

E parece funcionar. Aqui está o resultado.

insira a descrição da imagem aqui

Ye Lin Aung
fonte
E o pré-pirulito?
MacaronLover
Eu tenho tentado várias soluções para pré-pirulito. Até agora, sem sorte ainda :(
Ye Lin Aung
4

Se você criar um projeto com a gaveta de navegação Android Studiofornecida. Na sua classe Atividade principal, você pode simplesmente adicionar essa linha de código navigationView.setItemIconTintList(null);ao seu onCreatemétodo. Como isso;

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);
 navigationView.setItemIconTintList(null); // <----- HERE
 setupDrawerContent(navigationView);
David Adam
fonte
3

Você pode tentar usar um drawable matizado, não tenho certeza se ele funciona abaixo de 5.0.

Crie um drawable e adicione o seguinte código.

<?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"/>

E então altere o item de menu que você pode desenhar para o que você acabou de criar. Se isso não funcionar, não tenho certeza de outras soluções. Você pode tentar esta biblioteca: https://github.com/mikepenz/MaterialDrawer Eu uso muito isso em meus projetos.

Austin Hodak
fonte
Este método não funciona na API 17 (4.2). O motivo (pelo menos na minha experiência), é que a gaveta de navegação sobrepõe automaticamente um ícone branco com uma tonalidade preta quando o tema está definido. Quando removo a luz do meu tema, meus ícones retornam ao branco como eu pretendia que fossem.
Chris
1

Basta adicionar uma linha no xml

app:itemIconTint="@color/white"

Harsh Singhal
fonte
Ouapp:itemIconTint="@null"
Vlad
1

De alguma forma, como esse código não funciona MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

para que você possa usá-lo.

MainActivity.java

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
   navigationView.setNavigationItemSelectedListener(this); 
   navigationView.setItemIconTintList(null); // <-- HERE add this code for icon color
Parban
fonte
0

Adicione isso

 android:tint="@color/colorPrimary"
Null Pointer Exception
fonte