Возможно ли отключить (а не просто отключить) MenuItem в Android? - PullRequest
40 голосов
/ 10 марта 2012

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

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

Ответы [ 7 ]

62 голосов
/ 17 октября 2013

Во всех версиях 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);
    }
}
57 голосов
/ 01 июня 2012

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

  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

8 голосов
/ 24 марта 2016

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

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

2 голосов
/ 01 ноября 2016

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

Готово!

2 голосов
/ 27 августа 2012

setEnabled(false) отлично работает на API Level < 14, но на 14 элемент по-прежнему кликабелен.

1 голос
/ 10 января 2018

Вот простой способ сделать это (используя 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)
}
1 голос
/ 10 марта 2012

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

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

...