2012-03-10 46 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) 
} 
相關問題