是否有可能在Android中灰显(而不仅仅是禁用)一个MenuItem?

Way*_*Lue 42 android menu menuitem

关于Blackberry上的相同功能有一个问题,并且有一些不同的线程提到了这个bug(据我所知,它已经关闭但没有解析),但我还没有找到专门用于Android的bug.

我正在setEnabled(false)基于某些状态调用某些MenuItem,但它们在视觉上看起来是一样的.我希望它们以某种方式被抵消,以便用户知道当前的选项不可用 - 有没有办法做到这一点?

Fra*_*ank 64

在所有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果使用了这个图标,请确保在设置alpha之前改变它(),否则将调整使用此drawable的所有地方,这不一定是人们可能想要的. (16认同)
  • 请注意,这仅在MenuItem是图标时才有效。不适用于纯文本的MenuItem。 (4认同)
  • 这正是我正在寻找的。 (2认同)

Ole*_*ich 58

我遇到过同样的问题.有两种方法可以实现这一点:

  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

您可以调用invalidateOptionsMenu()(或从ABS supportInvalidateOptionsMenu())来重建菜单.

编辑:更新解决方案2

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

  • Nobu Games对您链接的Google Groups主题的回复在Jelly Bean中对我很有用:menuItem.getIcon().setAlpha(enabled?255:64); (16认同)
  • 这实际上是否改变了菜单项文本/标题的颜色?也就是说,它会变灰吗?据我所知,这只会影响图标.如果您没有图标但只有文字怎么办? (2认同)
  • 调用item.setEnabled()已经使文本显示为灰色.问题是,在Action Bars上,文本显示为灰色但图标不是 - 此代码将其显示为灰色. (2认同)
  • 谢谢,使用PorterDuff模式,MULTIPLY对我来说效果更好. (2认同)

Bry*_*yan 9

我发现了一种使用drawable选择器xml文件解决此问题的新方法.您只需创建一个带有要在菜单项中使用的图标的选择器,然后您可以更改色调,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>
Run Code Online (Sandbox Code Playgroud)

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


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

<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>
Run Code Online (Sandbox Code Playgroud)

然后当你调用item.setEnabled(enabled)图标的颜色和/或alpha时会随着状态而变化!