2012-03-10 130 views
35

有针对相同的功能on Blackberry提到这个bug(这已被尽可能我可以告诉关闭,但未得到解决)了几个不同的线程问题,而且,但我还没有为Android找到一个特别。是否有可能在Android中变灰(而不仅仅是禁用)MenuItem?

,我号召基于一些国家一定的MenuItems setEnabled(false),但它们在视觉上看起来是一样的。我希望它们以某种方式偏移,以便用户知道该选项目前不可用 - 是否有任何方法可以做到这一点?

回答

49

我有同样的问题。有得到这个工作的方式有两种:

  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

+0

接受并删除了我自己的答案。 – 2012-06-04 22:34:25

+1

这是否实际上改变了菜单项文本/标题的颜色?也就是说,它会变成灰色吗?从我的理解,这只会影响图标。如果你没有图标,只有文字会怎么样? – 2012-11-07 02:25:38

+2

调用item.setEnabled()已经使文本变灰。问题是,在操作栏上文本变灰,但图标不是 - 此代码灰色。 – 2012-11-07 06:57:25

1

看一看这个link

setEnabled也可用于MenuItems

+1

呀,我用的setEnabled,但它不会在视觉上改变它。 – 2012-03-10 04:08:58

+0

尝试下面的代码 public boolean onCreateOptionsMenu(Menu menu){ \t \t menu.add(0,1,1,“Test”)。setEnabled(false); \t \t return super.onCreateOptionsMenu(menu); \t} – Pavandroid 2012-03-10 04:29:43

+0

这对我来说工作得很好。 – Pavandroid 2012-03-10 05:34:52

2

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

54

在所有的Android版本,最简单的方式来使用它来显示一个菜单操作图标为禁用,并使其功能被禁用,以及:

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

这正是我所期待的。 – ElliotM 2014-04-01 19:58:26

+0

是的,这为我做了诡计,很高兴能够保留原始图标。 – 2014-11-25 23:28:53

+10

注意:如果使用其他图标,请务必在设置alpha之前对其进行mutate(),否则将调整使用此drawable的所有地方,这不一定是人们想要的。 – dimsuz 2015-04-09 19:28:35

5

我发现了一种新的方式来解决这个问题,采用可拉伸性选择器xml文件。你只需创建一个你想在你的菜单项使用的图标选择,那么你可以更改位图的色彩,字母或两个:

<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文件来选择资源:

<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)颜色和/或图标的阿尔法将随而变化州!

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

+0

此解决方案仅适用于Android 5.0+(API 21+)棒棒糖及更高版本,因此setColorFilter在早期版本中是必需的。 – straya 2016-08-19 04:59:28

0

我做到了,是在NavigationView使用“itemIconTint”的方式,也可以通过使用“itemTextColor”

这是Navigationview变灰文本/ menu_text_color”是一个选择:

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

完成!

0

这里有一个简单的方法来做到这一点(使用科特林):

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) 
} 
相关问题