android - change - oncreateoptionsmenu fragment
¿Es posible atenuar(no solo deshabilitar) un MenuItem en Android? (7)
Hay una pregunta sobre la misma funcionalidad en Blackberry , y algunos hilos diferentes se referían a este bug (que desde entonces se ha cerrado sin resolución por lo que yo sé), pero no he encontrado uno específicamente para Android.
Estoy llamando a setEnabled(false)
en ciertos elementos del menú basados en algún estado, pero visualmente tienen el mismo aspecto. Me gustaría que se compensen de alguna manera, para que el usuario sepa que la opción actualmente no está disponible, ¿hay alguna manera de hacerlo?
Aquí hay una manera simple de hacerlo (usando Kotlin):
fun changeMenuItemColour(enabled: Boolean) {
var menuItem = SpannableString(mCustomToolbar?.menu?.findItem(R.id.some_menu_item)?.title)
var style = activity?.resources?.getColor(R.color.darkGraphite)!!
if (enabled) style = activity?.resources?.getColor(R.color.black)!!
menuItem.setSpan(ForegroundColorSpan(style), 0, menuItem.length, 0)
}
Eche un vistazo a este link
setEnabled
también se puede usar para MenuItems
.
En todas las versiones de Android, la forma más fácil de usar esto es MOSTRAR un ícono de acción de menú como deshabilitado Y hacerlo FUNCIÓN como deshabilitado también:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.menu_my_item);
if (myItemShouldBeEnabled) {
item.setEnabled(true);
item.getIcon().setAlpha(255);
} else {
// disabled
item.setEnabled(false);
item.getIcon().setAlpha(130);
}
}
Encontré una nueva forma de resolver este problema usando un archivo selector xml dibujable. Simplemente crea un selector con el icono que desea usar en su elemento de menú, luego puede cambiar el matiz, alfa o ambos del mapa de bits:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<bitmap android:src="@drawable/ic_menu_item"
android:tint="@color/enabled_color"
android:alpha="@integer/enabled_alpha"/>
</item>
<item android:state_enabled="false">
<bitmap android:src="@drawable/ic_menu_item"
android:tint="@color/disabled_color"
android:alpha="@integer/disabled_alpha"/>
</item>
</selector>
Como nota al margen; Me gusta establecer el tinte a "?android:attr/textColorPrimary"
para estado habilitado y "?android:attr/textColorHint"
para estado desactivado. De esta forma se ajustará según el tema utilizado.
Luego puede simplemente configurar el ícono en su archivo xml de menú al recurso selector:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_action"
android:orderInCategory="0"
android:title="@string/title_menu_action"
android:icon="@drawable/ic_menu_item_selector"
app:showAsAction="ifRoom"/>
</menu>
Luego, cuando llame a item.setEnabled(enabled)
el color y / o alfa del icono cambiará junto con el estado.
La forma en que lo hice es usando "itemIconTint" en NavigationView, también puedes atenuar el texto usando "itemTextColor"
Esto es Navigationview:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:itemBackground="@color/white"
android:background="@color/white"
app:itemTextColor="@color/menu_text_color"
app:itemIconTint="@color/menu_text_color"
app:menu="@menu/main_drawer" />
y el "@ color / menu_text_color" es un selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="@color/primaryColor" />
<item android:state_enabled="false" android:color="@color/disabled_text_color" />
<item android:color="@color/primaryText" />
</selector>
Finalmente, si quiere deshabilitar un elemento de menú,
MenuItem item = mNavigationView.getMenu().findItem(R.id.your_menu_item);
item.setEnabled(isEnable);
¡Hecho!
Tuve el mismo problema. Hay dos formas de hacer que esto funcione:
- Coloque sus íconos en una Lista de estado para que se use un ícono diferente al deshabilitar
Lo que uso ahora Cambie el ícono usted mismo con algo como esto en
onPrepareOptionsMenu()
:public boolean onPrepareOptionsMenu(Menu menu) { boolean menusEnabled = reachedEndOfSlidehow(); // enable or disable? MenuItem item = menu.findItem(R.id.menu_next_slide); Drawable resIcon = getResources().getDrawable(R.drawable.ic_next_slide); if (!menusEnabled) resIcon.mutate().setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN); item.setEnabled(menusEnabled); // any text will be automatically disabled item.setIcon(resIcon); }
Puede invocar invalidateOptionsMenu()
(o desde ABS, supportInvalidateOptionsMenu()
) para reconstruir el menú.
EDITAR : solución actualizada 2
Fuente: https://groups.google.com/forum/?fromgroups#!topic/actionbarsherlock/Z8Ic8djq-3o
setEnabled(false)
funciona bien en API Level < 14
pero en 14
el elemento todavía se puede hacer clic.