Ikona elementu szuflady nawigacji nie pokazuje oryginalnego koloru

138

Próbuję wyświetlić ikonę obok pozycji w moim menu w szufladzie nawigacji, ale z jakiegoś powodu ikona zawsze jest wyświetlana w kolorze szarym, a nie w oryginalnym kolorze (brązowym). Czy jest jakiś sposób, aby temu zapobiec, aby pokazać oryginalny kolor ikony?

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>

wprowadź opis obrazu tutaj

MacaronLover
źródło
Co jest w twoim ic_browncircle?
Ye Lin Aung,
@YeLinAung Brązowe kółko, podobnie jak ikona powyżej obok „Podelementu 1”, ale w kolorze brązowym, a nie szarym.
MacaronLover
Może możesz spróbować .setColorFilter(MY_BROWN_COLOR)tego widoku?
Ye Lin Aung,
Zobacz moją odpowiedź poniżej.
Ye Lin Aung,

Odpowiedzi:

350

Znalazłem odpowiedź tutaj: https://stackoverflow.com/a/30632980/875249

Aby uniknąć linku, jest to całkiem proste:

    mNavigationView.setItemIconTintList(null);

Spowoduje to wyłączenie barwienia na podstawie stanu, ale możesz także określić własną listę. U mnie zadziałało!

Tutaj możesz uzyskać szczegółowe informacje na temat tworzenia listy stanów kolorów, ale jest to również dość proste: 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
źródło
Tak, przetestowałem to na Nexusie 4 z interfejsem API 17. Testowałem również na podglądzie Androida M. ColorStateList istnieje już od jakiegoś czasu, a NavigationView jest częścią biblioteki pomocy technicznej, więc nie widzę powodu, dla którego nie działałoby to aż do ICS, a być może nawet dalej.
Chris
11
Jakaś alternatywa XML do tego? Próbowałem, app:itemIconTint="@null"ale bez sukcesu.
Mangesh
Dzięki, zaczynałem
boleć
4
mNavigationView.setItemIconTintList(null);To jest odpowiedź, której szukałem tak długo ...
Jahid
1
Gdzie używasz selektora?
John Sardinha
49

Posługiwać się

    mNavigationView.setItemIconTintList(null);

prawda. Jeśli wszystkie twoje ikony są w jednym schemacie kolorów (miałem wszystkie białe), możesz skonfigurować za pomocą pliku xml - app: itemIconTint = "@ android: color / white"

Mój przypadek:

<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"
    />
Głaskanie pod brodę
źródło
Czy wiesz, jak rozwiązać ten inny problem?
MacaronLover
Ten działa dobrze, mNavigationView.setItemIconTintList(null);usuwa domyślny iconTint ze wszystkich ikon. Teraz, jeśli masz ikonę w kolorze czerwonym, będzie wyglądać na czerwoną, nie zostanie zastosowany żaden iconTint.
Syed Hissaan
5

Próbowałem czegoś podobnego w jednej z moich aplikacji. I tak, wygląda na to, że kolor ikony się nie zmienia. Ale udało mi się zrobić inne obejście. Oto mójic_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>

Myślę, że jest to coś podobnego do Ciebie, ale nie ma żadnego efektu i nie zmienia koloru.

Więc to, co zrobiłem, to to.

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

I wydaje się, że działa. Oto wynik.

wprowadź opis obrazu tutaj

Ye Lin Aung
źródło
A co z pre-Lollipopem?
MacaronLover
Próbowałem kilku rozwiązań dla pre-Lollipop. Jak na razie nie ma szczęścia :(
Ye Lin Aung,
4

Jeśli tworzysz projekt z szufladą nawigacyjną, którą Android Studioudostępniono. W swojej klasie Main Activity możesz po prostu dodać ten wiersz kodu navigationView.setItemIconTintList(null);do swojej onCreatemetody. Lubię to;

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);
 navigationView.setItemIconTintList(null); // <----- HERE
 setupDrawerContent(navigationView);
David Adam
źródło
3

Możesz spróbować użyć przyciemnianego rysunku, nie jestem pewien, czy działa poniżej 5,0.

Utwórz do rysowania i dodaj następujący kod.

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

A następnie zmień element menu, który można narysować, na ten, który właśnie utworzyłeś. Jeśli to nie zadziała, nie jestem pewien innych rozwiązań. Możesz wypróbować tę bibliotekę: https://github.com/mikepenz/MaterialDrawer Często jej używam w moich projektach.

Austin Hodak
źródło
Ta metoda nie działa na API 17 (4.2). Powodem (przynajmniej z mojego doświadczenia) jest to, że szuflada nawigacji automatycznie nakłada białą ikonę z czarnym odcieniem, gdy motyw jest ustawiony na jasny. Kiedy usuwam światło z mojego motywu, moje ikony wracają do białego koloru, tak jak chciałem.
Chris
1

Po prostu dodaj jedną linię w xml

app:itemIconTint="@color/white"

Harsh Singhal
źródło
Lubapp:itemIconTint="@null"
Vlad
1

Niektóre, jak ten kod nie działa MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

więc możesz go używać.

MainActivity.java

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
   navigationView.setNavigationItemSelectedListener(this); 
   navigationView.setItemIconTintList(null); // <-- HERE add this code for icon color
Parban
źródło
0

Dodaj

 android:tint="@color/colorPrimary"
Wyjątek zerowego wskaźnika
źródło