Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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>