android - change - Cambio de color de fondo en BottomNavigationView
change bottom navigation bar color android (3)
Encontré un problema similar a los OP, pero un poco diferente. Si coloca algo como @color/color_selector
en la app:itemBackground="___"
. Provocará que la vista se oculte en el panel de diseño y que la aplicación se aplaste cuando se inicie. A pesar de que funciona bien, solo hay que establecer un color constante como @color/black
.
Para una explicación más detallada, busqué en la referencia de Android Api. Ahora creo que he encontrado la respuesta que puede resolver razonablemente este problema. (Puede que no sea exacto)
El problema es que lo que usted proporciona NO ES EXACTAMENTE lo que pidieron .
app:itemIconTint
y app:itemTextColor
piden un color hexadecimal, mientras que app:itemBackground
pide un Drawable literalmente. Los elementos <color>
que escribimos en colors.xml
son ColorDrawable . Se deriva de Drawable para que pueda alimentar los tres atributos.
Sin embargo, cuando lo cambias para usar un selector, las cosas se vuelven diferentes. Tanto el color hexagonal como el dibujable tienen un selector correspondiente. Un selector actúa como el recurso que pones, pero el resultado no es el original. Es más como un envoltorio de un solo propósito. No puedes alimentar un color hexadecimal a un atributo que requiere un Dibujable .
El selector de color es en realidad un ColorStateList , proporciona un color hexadecimal, reside en res/color
. Puedes usar solo el atributo android:color
en este archivo. se le pedirá un error si escribe android:drawable
.
El selector de StateListDrawable es StateListDrawable , proporciona Drawable, reside en res/drawable
. Debería escribir android:drawable
aquí, pero no hay error si escribe android:color
.
Sin embargo, android:color
solo proporciona un color hexadecimal que no se puede reconocer como Drawable , mientras que app:itemBackground
requiere Drawable , por lo que la aplicación está condenada. (Causa directa)
Ambos atributos ( android:color
y android:drawable
) aceptan un ColorDrawable , aquí funciona igual que cuando se establece un color constante.
La solución (y la práctica) es:
Utilice (y solo)
android:drawable
enres/drawable/drawable_selector.xml
. Ejemplo:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/colorAccent" android:state_checked="true" /> <item android:drawable="@color/colorAccentDark" /> </selector>
Use
res/color/color_selector.xml
cuando necesite un color hexadecimal (para evitar confusiones). Ejemplo:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/white" android:state_checked="true"/> <item android:color="@color/colorPrimary" /> </selector>
Proporcionar
app:itemBackground
conapp:itemBackground
. Ejemplo:<android.support.design.widget.BottomNavigationView ... app:itemBackground="@drawable/drawable_selector" app:itemIconTint="@color/color_selector" app:itemTextColor="@color/color_selector" ... />
(Cabe destacar que si está utilizando Android Studio, su función de autocompletar le dirá qué atributos son legales y están disponibles, y no le sugiere que android:color
un selector en res/drawable
)
He implementado BottomNavigationView
que está disponible en la nueva biblioteca de soporte 25.0.0. Aquí está mi código para eso
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/text"
app:itemTextColor="@drawable/text"
app:menu="@menu/bottom_navigation_main" />
Y text.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_enabled="true" />
<item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
</selector>
Con este código, puedo cambiar el color del texto cuando se hace clic en el elemento del menú, pero cuando aplico lo mismo a la app:itemBackground
está mostrando la <item> tag requires a ''drawable'' attribute or child tag defining a drawable
error <item> tag requires a ''drawable'' attribute or child tag defining a drawable
.
Esto es lo que he probado para la app:itemBackground
app:itemBackground="@drawable/text"
Entonces, mi pregunta es ¿cómo puedo cambiar el color de fondo del elemento del menú seleccionado?
Encontré una respuesta de este post mediano.
- Necesitamos usar
android:state_checked
lugar deandroid:state_enabled
- dentro de
onNavigationItemSelected
debe usarreturn true
lugar dereturn false
.
y para establecer el fondo, no podemos usar android:color
en <item>
, necesitamos usar android:drawable
Así que aquí se ve el archivo xml cuando lo configuras para app:itemTextColor
and app:itemIconTint
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimaryDark" android:state_checked="true" />
<item android:color="@android:color/white" android:state_checked="false" />
</selector>
y para configurar la app:itemBackground
selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/banner_white" android:state_checked="true"/>
<item android:drawable="@drawable/banner_green" android:state_checked="false"/>
</selector>
Aquí banner_white
y banner_green
son pngs.
Inténtalo, es un ejemplo de código de elemento de navegación para seleccionar el oyente. Espero que te ayude.
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
// update highlighted item in the navigation menu
menuItem.setChecked(true);
mNavItemId = menuItem.getItemId();
// allow some time after closing the drawer before performing real navigation
// so the user can see what is happening
mDrawerLayout.closeDrawer(GravityCompat.START);
mDrawerActionHandler.postDelayed(new Runnable() {
@Override
public void run() {
navigate(menuItem.getItemId());
}
}, DRAWER_CLOSE_DELAY_MS);
return true;
}
Solución alternativa:
Haz un archivo dibujable highlight_color.xml con el siguiente contenido:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="YOUR HIGHLIGHT COLOR"/>
</shape>
Cree otro archivo dibujable nav_item_drawable.xml con el siguiente contenido:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>
Finalmente agregue la aplicación: etiqueta itemBackground en el NavView:
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:itemBackground="@drawable/nav_item_drawable"
app:menu="@menu/menu_drawer">
aquí, el archivo highlight_color.xml define un color sólido dibujable para el fondo. Más tarde, este color dibujable se asigna al selector nav_item_drawable.xml.
Prueba este.