El ícono del elemento del cajón de navegación no muestra el color original

138

Estoy tratando de mostrar un icono junto a un elemento dentro de mi menú para mi cajón de navegación, pero por alguna razón, el icono siempre aparece en gris en lugar del color original (marrón). ¿Hay alguna forma de evitar que esto suceda para mostrar el color original del icono?

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>

ingrese la descripción de la imagen aquí

MacaronLover
fuente
¿Qué hay en tu ic_browncircle?
Ye Lin Aung
@YeLinAung Un círculo marrón al igual que el icono de arriba al lado del 'Sub elemento 1' pero en el color marrón, no gris.
MacaronLover
¿Tal vez puedas intentar .setColorFilter(MY_BROWN_COLOR)esa vista?
Ye Lin Aung
Por favor vea mi respuesta a continuación.
Ye Lin Aung

Respuestas:

350

Encontré la respuesta aquí: https://stackoverflow.com/a/30632980/875249

Para evitar el enlace es bastante sencillo:

    mNavigationView.setItemIconTintList(null);

Esto desactiva todos los tintes basados ​​en estado, pero también puede especificar su propia lista. ¡Funciono muy bien para mi!

Aquí es donde puede obtener los detalles sobre cómo crear una lista de estados de color, pero también es bastante simple: 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
fuente
Sí, lo probé en un Nexus 4 con API 17. También probé en la vista previa de Android M. ColorStateList ha existido por un tiempo y NavigationView es parte de la biblioteca de soporte, por lo que no veo una razón por la cual esto no funcionaría hasta ICS y posiblemente incluso más atrás.
Chris
11
¿Alguna alternativa XML para esto? Probado app:itemIconTint="@null"pero sin éxito.
Mangesh
Gracias, estaba empezando a tener dolor de cabeza con este problema
wax911
44
mNavigationView.setItemIconTintList(null);Esta es la respuesta que estaba buscando durante tanto tiempo ...
Jahid
1
¿Dónde usas el selector?
John Sardinha
49

Utilizar

    mNavigationView.setItemIconTintList(null);

es lo correcto. Además, si todos sus iconos están en un esquema de color (tenía todo blanco), puede configurarlo a través del archivo xml - app: itemIconTint = "@ android: color / white"

Mi 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"
    />
Arrojar
fuente
¿Sabes cómo resolver este otro problema?
MacaronLover
Este funciona bien, mNavigationView.setItemIconTintList(null);elimina el ícono predeterminadoTinte de todos los íconos. Ahora, si tiene su icono en color rojo, aparecerá rojo, no se aplicará iconTint.
Syed Hissaan
5

He intentado algo similar en una de mis aplicaciones. Y sí, parece que el color del icono no cambia. Pero me las arreglé para hacer con otra solución. Aquí está miic_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>

Lo que creo que es algo similar a ti, pero no tiene ningún efecto y no cambia el color.

Entonces lo que hice es esto.

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

Y parece estar funcionando. Aquí está el resultado.

ingrese la descripción de la imagen aquí

Ye Lin Aung
fuente
¿Qué pasa con pre-Lollipop?
MacaronLover
He estado probando varias soluciones para pre-Lollipop. Hasta ahora, no hubo suerte :(
Ye Lin Aung
4

Si crea un proyecto con el cajón de navegación que Android Studioproporciona. En su clase de Actividad principal, simplemente puede agregar esta línea de código navigationView.setItemIconTintList(null);a su onCreatemétodo. Me gusta esto;

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

Puede intentar usar un dibujable tintado, no estoy seguro si funciona por debajo de 5.0.

Crea un dibujo y agrega el siguiente 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"/>

Y luego cambie su elemento de menú dibujable al que acaba de crear. Si eso no funciona, entonces no estoy seguro de ninguna otra solución. Puedes probar esta biblioteca: https://github.com/mikepenz/MaterialDrawer La uso mucho en mis proyectos.

Austin Hodak
fuente
Este método no funciona en API 17 (4.2). La razón (al menos en mi experiencia), es que el cajón de navegación superpone automáticamente un ícono blanco con un tinte negro cuando tiene su tema configurado a la luz. Cuando elimino la luz de mi tema, mis iconos vuelven a ser blancos como pretendía que fueran.
Chris
1

Solo agregue una línea en xml

app:itemIconTint="@color/white"

Harsh Singhal
fuente
O bienapp:itemIconTint="@null"
Vlad
1

De alguna manera, este código no funciona MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

para que puedas usarlo.

MainActivity.java

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

Agrega esto

 android:tint="@color/colorPrimary"
Excepción de puntero nulo
fuente