2012-03-10 3 views
35

Существует вопрос для той же функциональности on Blackberry, и несколько разных тем, на которые ссылается этот bug (с тех пор, как я могу сказать, это было закрыто без разрешения), но я не нашел его специально для Android.Можно ли отключить (не просто отключить) меню MenuItem в Android?

Я звоню 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()), чтобы восстановить меню.

EDIT: Обновленный раствор 2

Источник: https://groups.google.com/forum/?fromgroups#!topic/actionbarsherlock/Z8Ic8djq-3o

+0

Принял и удалил свой собственный ответ. –

+1

Действительно ли это изменяет цвет текста/названия пункта меню? То есть, серое это? Из того, что я понимаю, это повлияет только на значок. Что делать, если у вас нет значка и есть только текст? –

+2

Вызов item.setEnabled() уже сделает текст серым. Проблема в том, что на Action Bars текст выделен серым цветом, но значок отсутствует - этот код выгружает его. –

1

Взгляните на этот link

setEnabled также может быть использован для MenuItems.

+1

Да, я использую setEnabled, но это не меняет его визуально. –

+0

попробуйте приведенный ниже код public boolean onCreateOptionsMenu (меню меню) { menu.add (0, 1, 1, «Test»). SetEnabled (false); \t \t возвращение super.onCreateOptionsMenu (меню); \t} – Pavandroid

+0

Это прекрасно работает для меня. – Pavandroid

2

setEnabled(false) отлично работает на API Level < 14 но 14 деталь еще кликабельны.

54

на всех андроид версии, самый простой способ использовать это, чтобы показать значок действий меню, как отключено и сделать его 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); 
    } 
} 
+0

Это именно то, что я искал. – ElliotM

+0

Yup, это сделало трюк для меня, приятно иметь оригинальную иконку. –

+10

Примечание: если этот значок используется elsewere, обязательно измените его() до установки альфа, иначе все места, в которых используется эта возможность, будут скорректированы, что не обязательно того, что может потребоваться. – dimsuz

5

Я нашел новый способ решить эту проблему с помощью растяжимой selector xml file. Вы просто создать селектор со значком вы хотите использовать в пункте меню, то вы можете либо изменить оттенок, альфа или оба из растрового изображения:

<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) цвет и/или альфа значка будет меняться вместе с государство!

+0

Это решение жизнеспособно только для Android 5.0+ (API 21+) Lollipop и выше, поэтому setColorFilter необходим в более ранних версиях. – straya

0

То, как я сделал это с помощью «itemIconTint» в NavigationView, вы можете также серым цветом текст с помощью «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»является селектором:

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

Done!

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) 
} 
Смежные вопросы