Возможно ли отключить (не просто отключить) MenuItem в Android?
Есть вопрос для тех же функциональных возможностей на Blackberry, и несколько разных потоков относятся к этому ошибка (которая с тех пор была закрыта без разрешения, насколько я могу судить), но я не нашел ее специально для Android.
Я вызываю setEnabled(false)
в некоторых MenuItems на основе некоторого состояния, но они визуально выглядят одинаково. Я бы хотел, чтобы они были каким-то образом смещены, так что пользователь знает, что опция в настоящее время недоступна - есть ли способ сделать это?
Ответы
Ответ 1
У меня была такая же проблема. Есть два способа заставить это работать:
- Поместите свои значки в StateList, чтобы использовать другой значок для отключения
-
То, что я использую сейчас. Измените значок с помощью чего-то вроде этого в 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
Ответ 2
Во всех версиях 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);
}
}
Ответ 3
Я нашел новый способ решить эту проблему, используя гибкий 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)
, цвет и/или альфа иконки будут меняться вместе с состоянием!
Ответ 4
Как я это сделал, используя "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);
Готово!
Ответ 5
setEnabled(false)
работает отлично на API Level < 14
, но на 14
элемент все еще доступен для клика.
Ответ 6
Посмотрите на ссылку
setEnabled
также можно использовать для MenuItems
.
Ответ 7
Вот простой способ сделать это (используя Kotlin):
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)
}
Ответ 8
У меня были трудности с этим на современном Android с темой MaterialComponents. Моя проблема заключалась в том, что я установил <item name="actionMenuTextColor">@color/blue</item>
в styles.xml
, и это переопределяет цвет текста, независимо от того, включен элемент или нет. Решение состоит в том, чтобы установить список состояний цвета, а не цвет напрямую.
Мой атрибут стилей теперь выглядит следующим образом:
<item name="actionMenuTextColor">@drawable/menu_color_selector</item>