Можно ли отключить (а не просто отключить) MenuItem в Android?

На Blackberry существует вопрос о той же функциональности, и несколько разных потоков относятся к этой ошибке (которая с тех пор была закрыта без разрешения, насколько я могу судить), но я не нашел ее специально для Android.

Я setEnabled(false) на некоторых элементах MenuItems на основе некоторого состояния, но они визуально выглядят одинаково. Я бы хотел, чтобы они были каким-то образом компенсированы, так что пользователь знает, что опция в настоящее время недоступна – есть ли способ сделать это?

Solutions Collecting From Web of "Можно ли отключить (а не просто отключить) MenuItem в Android?"

Я была такая же проблема. Есть два способа заставить это работать:

  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

На всех версиях 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-файл селектора. Вы просто создаете селектор со значком, который хотите использовать в своем пункте меню, тогда вы можете либо изменить оттенок, альфа или оба растрового изображения:

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

Посмотрите на эту ссылку

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

setEnabled(false) отлично работает на API Level < 14 но на 14 элемент все еще setEnabled(false) .

Согласно этой теме , setEnabled(false) – это то, что вы хотите.

То, как я это делал, – это использовать «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); 

Готово!