同じ機能についての質問があります on Blackberry 、およびこれを参照するいくつかの異なるスレッド bug (私が知る限り解決せずに閉じられています) Android専用のものは見つかりませんでした。
ある状態に基づいて特定のMenuItemでsetEnabled(false)
を呼び出していますが、視覚的には同じように見えます。オプションが現在利用できないことをユーザーが知っているように、それらを何らかの方法で相殺したい-それを行う方法はありますか?
同じ問題がありました。これを機能させるには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バージョン、これを使用してメニューアクションアイコンを無効として表示し、同様に機能として無効にする最も簡単な方法:
@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)
を呼び出すと、アイコンの色やアルファが状態とともに変化します!
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);
できた!
setEnabled(false)
はAPI Level < 14
では正常に動作しますが、14
では引き続きアイテムをクリック可能です。
(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)
}
これをご覧ください link
setEnabled
は、MenuItems
にも使用できます。
モダンAndroid MaterialComponentsテーマでこれに問題がありました。問題は<item name="actionMenuTextColor">@color/blue</item>
in styles.xml
そしてこれは、アイテムが有効か無効かにかかわらず、テキストの色を上書きします。解決策は、直接ではなく Color state list を設定することです。
私のスタイル属性は次のようになりました。
<item name="actionMenuTextColor">@drawable/menu_color_selector</item>