概要
ある条件のときにOptionsMenuの一部のMenuItemをグレーアウトにして、タップできないようにしてみたので備忘録として記載
OptionsMenuの実装
private boolean isEnable = true;
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.menu_item, menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
AppCompatActivity activity = (AppCompatActivity) getActivity();
int id = item.getItemId();
switch (id) {
case R.id.menu_first:
activity.getSupportActionBar().invalidateOptionsMenu();
isEnable = false
return true;
case R.id.menu_second:
return true;
}
return super.onOptionsItemSelected(item);
}
今回はFragmentで実装したためFragmentで記載
Activity
の方でsetHasOptionsMenu(true)
をしないとOptionsMenuが表示されないので注意
※Fragmentの表示処理に関しては割愛
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_first"
android:orderInCategory="1"
android:title="メニュー1"
app:showAsAction="never" />
<item
android:id="@+id/menu_second"
android:orderInCategory="2"
android:title="メニュー2"
app:showAsAction="never" />
</menu>
オーバーフローメニューに格納するため、app:showAsAction="never"
を入れておく
onPrepareOptionsMenuでOptionsMenuのメニュー更新
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.findItem(R.id.menu_second).setEnabled(isEnable);
}
レイアウトファイルにToolbar
を使用していない場合はsetEnable
するだけでグレーアウトできそうだが、Toolbar
を使用している場合は、setEnable
しただけだとグレーあうとにはならないので、Themeを使用してapp:popupTheme
の属性指定をしてあげる
Toolbarを使用している場合
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#727272" />
<item android:color="#000000"/>
</selector>
color
のパッケージの中にselector
を作り、false
のときはメニューテキストをグレーにして、それ以外は黒色にする
<style name="AppThemeOverlay.AppBar.Menu" parent="ThemeOverlay.AppCompat.Light">
<item name="android:textColor">@color/menu_item_text</item>
</style>
先ほど作った、selector
を使うようにして、メニューテキストがグレーアウトするようにstyles
でThemeを作成
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:popupTheme="@style/AppThemeOverlay.AppBar.Menu" />
</LinearLayout>
Toolbar
の中でapp:popupTheme="@style/AppThemeOverlay.AppBar.Menu"
してあげれば、Toolbar
を独自実装していてもsetEnable
するだけでグレーアウトになる