web-dev-qa-db-ja.com

AndroidのMenuItemをグレー表示する(無効にするだけでなく)ことは可能ですか?

同じ機能についての質問があります on Blackberry 、およびこれを参照するいくつかの異なるスレッド bug (私が知る限り解決せずに閉じられています) Android専用のものは見つかりませんでした。

ある状態に基づいて特定のMenuItemでsetEnabled(false)を呼び出していますが、視覚的には同じように見えます。オプションが現在利用できないことをユーザーが知っているように、それらを何らかの方法で相殺したい-それを行う方法はありますか?

40
Waynn Lue

同じ問題がありました。これを機能させるには2つの方法があります。

  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

57
Oleg Vaskevich

すべての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);
    }
}
63
Frank

描画可能なセレクター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)を呼び出すと、アイコンの色やアルファが状態とともに変化します!

8
Bryan

NavigationViewで「itemIconTint」を使用する方法です。「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
SoYoung

setEnabled(false)API Level < 14では正常に動作しますが、14では引き続きアイテムをクリック可能です。

2
Hoochwo

(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
Andrew Odendaal

これをご覧ください link

setEnabledは、MenuItemsにも使用できます。

1
Pavandroid

モダンAndroid MaterialComponentsテーマでこれに問題がありました。問題は<item name="actionMenuTextColor">@color/blue</item> in styles.xmlそしてこれは、アイテムが有効か無効かにかかわらず、テキストの色を上書きします。解決策は、直接ではなく Color state list を設定することです。

私のスタイル属性は次のようになりました。

<item name="actionMenuTextColor">@drawable/menu_color_selector</item>

0