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í


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

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

¿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í


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

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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.