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

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

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

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

  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() )来重建菜单。

编辑 :更新解决方案2

来源: 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); } } 

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

         

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


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

    

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

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

看看这个链接

setEnabled也可以用于MenuItems

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

这是Navigationview:

  

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

       

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

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

完成!

这是一个简单的方法(使用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) }