studio onprepareoptionsmenu menus ejemplos desplegable contextual context bar android xml menu

android - onprepareoptionsmenu - Iconos de menú de tinte



menus en android ejemplos (4)

Ahora puede usar el tintado de DrawableCompat lugar del filtro de color:

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); Drawable favoriteIcon = DrawableCompat.wrap(favoriteItem.getIcon()); ColorStateList colorSelector = ResourcesCompat.getColorStateList(getResources(), R.color.tinted_selector, getTheme()); DrawableCompat.setTintList(favoriteIcon, colorSelector); favoriteItem.setIcon(favoriteIcon);

Estoy creando una aplicación para Android y uso los iconos del Paquete de iconos de la barra de acción para usar en la barra de acción. Los defino a través de los archivos xml en la carpeta del menu . ¿Hay una manera de "tintar" estos iconos para que todos sean del mismo color? Hasta ahora, tengo que hacerlo manualmente con un software de edición de imágenes, pero si decido cambiar el color, debo hacerlo de nuevo.

Sé que hay un atributo de android:tint para ImageView pero no he encontrado una forma de usarlo para los íconos del menú.

Gracias


Para mejorar, puedes crear un método estático en una clase de utils y usar ese método cada vez que quieras.

-------- DEFINE SU MÉTODO -----------------------------------

public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) { Drawable normalDrawable = item.getIcon(); Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable); DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color)); item.setIcon(wrapDrawable); }

--------------------- CÓMO LO USE -------------------------- -----

Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem menuItem = menu.findItem(R.id.action_delete); if (menuItem != null) { tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE } return true; }

Mi fuente fue: https://futurestud.io/tutorials/android-quick-tips-8-how-to-dynamically-tint-actionbar-menu-icons


Puede haber una mejor manera de hacerlo, pero una opción es volver a dibujar el ícono en el código.

Supongamos que tiene un elemento de menú para favoritos y desea tintarlo de gris:

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); Drawable newIcon = (Drawable)favoriteItem.getIcon(); newIcon.mutate().setColorFilter(Color.argb(255, 200, 200, 200), PorterDuff.Mode.SRC_IN); favoriteItem.setIcon(newIcon);

También puede utilizar un recurso de color como

newIcon.mutate().setColorFilter(getResources().getColor(R.color.myCustomTint), PorterDuff.Mode.SRC_IN);


Si la fuente original del icono es una imagen ráster, entonces es posible envolverla en <bitmap> .

Agregue este archivo en la carpeta dibujable - settings_icon.xml:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_action_settings" android:tint="@color/colorRed"/>

y luego use este dibujo para el elemento del menú:

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/new_game" android:icon="@drawable/settings_icon" android:title="@string/settings" app:showAsAction="always"/> </menu>