Das Symbol für das Navigationsfachelement zeigt keine Originalfarbe an

138

Ich versuche, ein Symbol neben einem Element in meinem Menü für meine Navigationsschublade anzuzeigen, aber aus irgendeinem Grund wird das Symbol immer in Grau und nicht in der Originalfarbe (Braun) angezeigt. Gibt es eine Möglichkeit, dies zu verhindern, um die ursprüngliche Farbe des Symbols anzuzeigen?

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>

Geben Sie hier die Bildbeschreibung ein

MacaronLover
quelle
Was ist in deinem ic_browncircle?
Ye Lin Aung
@YeLinAung Ein brauner Kreis wie das Symbol oben neben 'Unterelement 1', jedoch in der Farbe Braun, nicht Grau.
MacaronLover
Vielleicht können Sie versuchen .setColorFilter(MY_BROWN_COLOR), diese Ansicht?
Ye Lin Aung
Bitte sehen Sie meine Antwort unten.
Ye Lin Aung

Antworten:

350

Ich habe die Antwort hier gefunden: https://stackoverflow.com/a/30632980/875249

Um den Link zu vermeiden, ist es ziemlich einfach:

    mNavigationView.setItemIconTintList(null);

Dies deaktiviert alle zustandsbasierten Tönungen, Sie können jedoch auch Ihre eigene Liste angeben. Es hat super für mich funktioniert!

Hier erhalten Sie Details zum Erstellen einer Farbstatusliste, die jedoch auch recht einfach ist: 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
quelle
Ja, ich habe es auf einem Nexus 4 mit API 17 getestet. Ich habe es auch auf der Android M-Vorschau getestet. ColorStateList gibt es schon eine Weile und NavigationView ist Teil der Support-Bibliothek, daher sehe ich keinen Grund, warum dies nicht bis zum ICS und möglicherweise sogar noch weiter hinten funktioniert.
Chris
11
Irgendeine XML-Alternative dafür? Versucht, app:itemIconTint="@null"aber kein Erfolg.
Mangesh
Vielen Dank, ich bekam Kopfschmerzen mit diesem Problem
Wax911
4
mNavigationView.setItemIconTintList(null);Dies ist die Antwort, nach der ich so lange gesucht habe ...
Jahid
1
Wo benutzt du den Selektor?
John Sardinha
49

Verwenden

    mNavigationView.setItemIconTintList(null);

es ist richtig. Auch wenn alle Ihre Symbole in einem Farbschema (ich hatte alle weiß), können Sie über XML-Datei einrichten - app: itemIconTint = "@ android: color / white"

Mein Fall:

<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"
    />
Futter
quelle
Wissen Sie, wie Sie dieses andere Problem
MacaronLover
Dieser funktioniert gut, mNavigationView.setItemIconTintList(null);entfernt den Standard iconTint von allen Symbolen. Wenn Sie Ihr Symbol nun in roter Farbe haben, wird es rot angezeigt und es wird kein iconTint angewendet.
Syed Hissaan
5

Ich habe in einer meiner Apps etwas Ähnliches ausprobiert. Und ja, es scheint, dass sich die Symbolfarbe nicht ändert. Aber ich habe es geschafft, eine andere Problemumgehung zu finden. Hier ist meinsic_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>

Was ich glaube, ist etwas Ähnliches wie Sie, aber es hat keine Wirkung und ändert die Farbe nicht.

Also habe ich das getan.

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

Und es scheint zu funktionieren. Hier ist das Ergebnis.

Geben Sie hier die Bildbeschreibung ein

Ye Lin Aung
quelle
Was ist mit Pre-Lollipop?
MacaronLover
Ich habe mehrere Lösungen für Pre-Lollipop ausprobiert. Bisher noch kein Glück :(
Ye Lin Aung
4

Wenn Sie ein Projekt mit Navigationsschublade erstellen, wird das Android Studiomitgeliefert. In Ihrer Hauptaktivitätsklasse können Sie diese Codezeile einfach navigationView.setItemIconTintList(null);zu Ihrer onCreateMethode hinzufügen . So was;

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

Sie können versuchen, ein getöntes Zeichenelement zu verwenden. Sie sind sich nicht sicher, ob es unter 5.0 funktioniert.

Erstellen Sie eine Zeichnung und fügen Sie den folgenden Code hinzu.

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

Ändern Sie dann Ihren zu zeichnenden Menüpunkt in den gerade erstellten. Wenn das nicht funktioniert, bin ich mir keiner anderen Lösung sicher. Sie können diese Bibliothek ausprobieren: https://github.com/mikepenz/MaterialDrawer Ich verwende sie häufig in meinen Projekten.

Austin Hodak
quelle
Diese Methode funktioniert nicht mit API 17 (4.2). Der Grund (zumindest meiner Erfahrung nach) ist, dass die Navigationsleiste automatisch ein weißes Symbol mit einem schwarzen Farbton überlagert, wenn Sie Ihr Thema auf Licht setzen. Wenn ich das Licht aus meinem Thema entferne, werden meine Symbole wieder weiß, wie ich es beabsichtigt habe.
Chris
1

Fügen Sie einfach eine Zeile in XML hinzu

app:itemIconTint="@color/white"

Harter Singhal
quelle
Oderapp:itemIconTint="@null"
Vlad
1

Einige, wie dieser Code nicht funktioniert MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

so können Sie es verwenden.

MainActivity.java

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

Füge das hinzu

 android:tint="@color/colorPrimary"
Nullzeiger-Ausnahme
quelle