是否有可能变灰(而不仅仅是禁用)Android中的MenuItem?

在Blackberry上有同样的function,有几个不同的线程提到了这个bug (从我的分析结果来看 ,这个bug已经被解决了),但是我还没有find一个专门针对Android的bug 。

我打电话setEnabled(false)在某些MenuItems基于某些状态,但他们在外观上看起来是一样的。 我想他们以某种方式抵消,以便用户知道目前​​的选项不可用 – 有什么办法可以做到这一点?

Solutions Collecting From Web of "是否有可能变灰(而不仅仅是禁用)Android中的MenuItem?"

我遇到过同样的问题。 有两种方法可以使其工作:

  1. 把你的图标放在一个StateList中,以便在禁用时使用不同的图标
  2. 我现在用什么 在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); } 

你可以调用invalidateOptionsMenu() (或者从ABS, supportInvalidateOptionsMenu() )来重build菜单。

编辑 :更新解决scheme2

来源: https : //groups.google.com/forum/?fromgroups#!topic / actionbarsherlock / Z8Ic8djq-3o

在所有的Android版本上,使用这个最简单的方法来显示菜单操作图标为禁用,并使其function被禁用:

 @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); } } 

我find了一个新的方法来解决这个问题,使用可绘制的select器XML文件。 您只需在菜单项中使用您想要使用的图标创build一个select器,然后就可以更改色调,alpha或两者的位图:

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

作为一个附注; 我喜欢将颜色设置为"?android:attr/textColorPrimary"为启用状态, "?android:attr/textColorHint"为禁用状态。 这样它将根据使用的主题进行调整。


然后,您可以将菜单xml文件中的图标设置为select器资源:

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

那么当你调用item.setEnabled(enabled)时,图标的颜色和/或alpha将随着状态而改变!

setEnabled(false)API Level < 14上工作正常,但在14该项仍然可点击。

看看这个链接

setEnabled也可以用于MenuItems

我做的方法是通过在NavigationView中使用“itemIconTint”,你也可以通过使用“itemTextColor”

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

和“@ color / menu_text_color”是一个select器:

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

最后,如果你想禁用一个菜单项,

 MenuItem item = mNavigationView.getMenu().findItem(R.id.your_menu_item); item.setEnabled(isEnable); 

完成!