0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Android】OptionsMenuでMenuItemをグレーアウトにする

Last updated at Posted at 2020-03-09

概要

ある条件のときにOptionsMenuの一部のMenuItemをグレーアウトにして、タップできないようにしてみたので備忘録として記載

OptionsMenuの実装

MainFragment.java
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の表示処理に関しては割愛

menu_item.xml
<?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のメニュー更新

MainFragment.java
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
    menu.findItem(R.id.menu_second).setEnabled(isEnable);
}

レイアウトファイルにToolbarを使用していない場合はsetEnableするだけでグレーアウトできそうだが、Toolbarを使用している場合は、setEnableしただけだとグレーあうとにはならないので、Themeを使用してapp:popupThemeの属性指定をしてあげる

Toolbarを使用している場合

menu_item_text.xml
<?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のときはメニューテキストをグレーにして、それ以外は黒色にする

styles.xml
<style name="AppThemeOverlay.AppBar.Menu" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:textColor">@color/menu_item_text</item>
</style>

先ほど作った、selectorを使うようにして、メニューテキストがグレーアウトするようにstylesでThemeを作成

fragment_main.xml
<?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するだけでグレーアウトになる

#参考
Androidでメニューをグレーアウトさせる - TadaoYamaokaの日記

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?