Cómo cambiar los iconos de los iconos del menú de navegación y desbordamiento de la barra de herramientas (appcompat v7)?
Estoy teniendo un rato duro con la barra de herramientas v7. Lo que una vez fue una tarea sencilla para ActionBar
, ahora parece demasiado complejo. No importa el estilo que establezco, no puedo cambiar ni el icono de navegación (que abre un cajón) ni el icono del menú de desbordamiento (que abre un menú).
Así que tengo una Toolbar
- Diseño de material Android: eliminar animación de sugerencias
- Material TabLayout elevación no funciona
- Android: Qué práctica es mejor para usar CoordinatorLayout
- Diseño de material control paso a paso
- Crear circular revelar para los dispositivos pre-Lollipop (Android)
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/ghex" android:minHeight="?attr/actionBarSize" app:theme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
I código que se ve como este
//before in the code I do mToolbar = (Toolbar) findViewById(R.id.toolbar); private void initToolbar() { setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }
Ahora, necesito cambiar el Drawable
para esos dos iconos.
¿Cómo hago esto para la Toolbar
compat v7? Supongo que tendría que cambiar la flecha visible cuando el cajón está abierto (Android 5.0).
- ¿Cómo implementar costuras en el diseño de materiales en android?
- Cómo inflar android NavigationView con otro menú dinámicamente durante onClick?
- Cómo utilizar TextInputLayout con Theme.material?
- Espacio en blanco con CardView en dispositivos pre-pirulí
- Cómo configurar un efecto ripple en textview o imageview en Android?
- Centro de la pestaña activa dentro de TabLayout
- Alertdialog en el diseño del material
- ¿Cómo puedo emular la elevación del botón (sombra) en la API de Android inferior a 21?
Para cambiar el icono de navegación puede utilizar:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.drawable.my_icon);
Para cambiar el icono de desbordamiento, puede definir un estilo como este:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light"> <item name="actionOverflowButtonStyle">@style/OverFlow</item> </style> <style name="OverFlow" parent="Widget.AppCompat.ActionButton.Overflow"> <item name="android:src">@drawable/my_overflow_menu</item> </style>
En cualquier caso, podría no ser una buena idea cambiar un icono estándar, como el menú de desbordamiento.
Si desea cambiar el color del icono puede utilizar:
<android.support.v7.widget.Toolbar app:theme="@style/ThemeToolbar" /> <style name="ThemeToolbar" parent="Theme.AppCompat.Light"> <!-- navigation icon color --> <item name="colorControlNormal">@color/my_color</item> <!-- color of the menu overflow icon --> <item name="android:textColorSecondary">@color/my_color</item> </style>
mToolbar.setNavigationIcon(R.mipmap.ic_launcher); mToolbar.setOverflowIcon(getResources().getDrawable(R.mipmap.ic_menu));
Todas las soluciones anteriores trabajaron para mí en API 21 o superior, pero no en API 19 (KitKat). Hacer un pequeño cambio hizo el truco para mí en las versiones anteriores. Aviso Widget.Holo
lugar de Widget.AppCompat
<style name="OverFlowStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow"> <item name="android:src">@drawable/ic_overflow</item> </style>
Hay un acercamiento simple, fácil y mejor, si necesitamos cambiar solamente el color del icono de la hamburguesa / de la parte posterior.
Es mejor, ya que cambia el color sólo del icono deseado, mientras que colorControlNormal
y android:textColorSecondary
podría afectar a otros niños de la barra de herramientas también.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style>
Para el menú de la derecha puede hacerlo:
public static Drawable setTintDrawable(Drawable drawable, @ColorInt int color) { drawable.clearColorFilter(); drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); drawable.invalidateSelf(); Drawable wrapDrawable = DrawableCompat.wrap(drawable).mutate(); DrawableCompat.setTint(wrapDrawable, color); return wrapDrawable; }
Y en su actividad
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_profile, menu); Drawable send = menu.findItem(R.id.send); Drawable msg = menu.findItem(R.id.message); DrawableUtils.setTintDrawable(send.getIcon(), Color.WHITE); DrawableUtils.setTintDrawable(msg.getIcon(), Color.WHITE); return true; }
Este es el resultado:
Para mostrar el icono, use getSupportActionBar().setIcon(R.xxx.xxx)
En mi caso el código es: –
getSupportActionBar().setIcon (R.mipmap.ic_launcher);
- El constructor de vista personalizada no se llama a android 5.0.2
- No se puede instalar Android ADT 21.1 en eclipse Juno (Windows 7) después de actualizar a SDK 21.1