L'icône de l'élément du tiroir de navigation n'affiche pas la couleur d'origine

138

J'essaie d'afficher une icône à côté d'un élément de mon menu pour mon tiroir de navigation, mais pour une raison quelconque, l'icône apparaît toujours en gris plutôt que dans la couleur d'origine (marron). Existe-t-il un moyen d'empêcher que cela se produise afin d'afficher la couleur d'origine de l'icône?

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;
            }
        });
    }
}

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

entrez la description de l'image ici

MacaronLover
la source
Qu'y a-t-il dans votre ic_browncircle?
Ye Lin Aung
@YeLinAung Un cercle marron tout comme l'icône ci-dessus à côté de 'Sous-élément 1' mais de couleur marron, pas gris.
MacaronLover
Peut-être pouvez-vous essayer .setColorFilter(MY_BROWN_COLOR)ce point de vue?
Ye Lin Aung
Veuillez voir ma réponse ci-dessous.
Ye Lin Aung

Réponses:

350

J'ai trouvé la réponse ici: https://stackoverflow.com/a/30632980/875249

Pour éviter le lien, c'est assez simple:

    mNavigationView.setItemIconTintList(null);

Cela désactive toutes les teintes basées sur l'état, mais vous pouvez également spécifier votre propre liste. Cela a très bien fonctionné pour moi!

Voici où vous pouvez obtenir les détails sur la création d'une liste d'états de couleurs, mais c'est assez simple aussi: 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
la source
Oui, je l'ai testé sur une API Nexus 4 exécutant 17. J'ai également testé sur l'aperçu Android M. ColorStateList existe depuis un certain temps et NavigationView fait partie de la bibliothèque de support, donc je ne vois pas pourquoi cela ne fonctionnerait pas jusqu'à ICS et peut-être même plus en arrière.
Chris
11
Une alternative XML pour cela? Essayé app:itemIconTint="@null"mais sans succès.
Mangesh
Merci, je commençais à avoir mal à la tête avec ce problème
wax911
4
mNavigationView.setItemIconTintList(null);C'est la réponse que je cherchais depuis si longtemps ...
Jahid
1
Où utilisez-vous le sélecteur?
John Sardinha
49

Utilisation

    mNavigationView.setItemIconTintList(null);

c'est juste. Aussi si toutes vos icônes dans un jeu de couleurs (j'avais tout le blanc), vous pouvez configurer via un fichier xml - app: itemIconTint = "@ android: couleur / blanc"

Mon cas:

<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"
    />
Mandrin
la source
Savez-vous comment résoudre cet autre problème?
MacaronLover
Celui-ci fonctionne bien, mNavigationView.setItemIconTintList(null);supprime l'icône par défautTint de toutes les icônes. Maintenant, si votre icône est de couleur rouge, elle apparaîtra en rouge, aucune iconTint ne sera appliquée.
Syed Hissaan
5

J'ai essayé quelque chose de similaire dans l'une de mes applications. Et oui, il semble que la couleur de l'icône ne change pas. Mais j'ai réussi à faire avec une autre solution de contournement. Voici monic_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>

Ce qui, je crois, est quelque chose de similaire à vous, mais cela n'a aucun effet et ne change pas la couleur.

Alors ce que j'ai fait, c'est ceci.

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

Et cela semble fonctionner. Voici le résultat.

entrez la description de l'image ici

Ye Lin Aung
la source
Et pour pré-Lollipop?
MacaronLover
J'ai essayé plusieurs solutions pour pré-Lollipop. Jusqu'à présent, pas encore de chance :(
Ye Lin Aung
4

Si vous créez un projet avec un tiroir de navigation dont le Android Studiofichier. Dans votre classe Activité principale, vous pouvez simplement ajouter cette ligne de code navigationView.setItemIconTintList(null);à votre onCreateméthode. Comme ça;

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

Vous pouvez essayer d'utiliser un dessinable teinté, sans savoir s'il fonctionne en dessous de 5,0.

Créez un dessinable et ajoutez le code suivant.

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

Et puis changez votre élément de menu dessiné à celui que vous venez de créer. Si cela ne fonctionne pas, je ne suis pas sûr d’autres solutions. Vous pouvez essayer cette librairie: https://github.com/mikepenz/MaterialDrawer Je l'utilise beaucoup dans mes projets.

Austin Hodak
la source
Cette méthode ne fonctionne pas sur l'API 17 (4.2). La raison (du moins d'après mon expérience), est que le tiroir de navigation superpose automatiquement une icône blanche avec une teinte noire lorsque votre thème est activé. Lorsque je supprime la lumière de mon thème, mes icônes redeviennent blanches comme je l'avais prévu.
Chris
1

Ajoutez simplement une ligne en xml

app:itemIconTint="@color/white"

Singhal dur
la source
Ouapp:itemIconTint="@null"
Vlad
1

Certains comment ce code ne fonctionne pas MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

afin que vous puissiez l'utiliser.

MainActivity.java

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

Ajoute ça

 android:tint="@color/colorPrimary"
Exception de pointeur nul
la source