web-dev-qa-db-ja.com

Android:ボタンクリックでオプションメニュー項目を有効/無効にする方法

onCreateOptionsMenuまたはonOptionsItemSelectedメソッドを使用している場合、簡単に実行できます。

しかし、画面のどこかにボタンがあり、そのボタンをクリックすると、コンテキストメニュー項目が有効/無効になります。

114
Vikas

とにかく、 ドキュメント がすべてをカバーしています。

実行時のメニュー項目の変更

アクティビティが作成されると、上記のようにonCreateOptionsMenu()メソッドが1回だけ呼び出されます。システムは、アクティビティが破棄されるまで、このメソッドで定義したMenuを保持し、再利用します。オプションメニューを最初に作成した後にいつでも変更する場合は、onPrepareOptionsMenu()メソッドをオーバーライドする必要があります。これにより、現在存在するMenuオブジェクトが渡されます。これは、アプリケーションの現在の状態に応じてメニュー項目を削除、追加、無効化、または有効化する場合に便利です。

例えば。

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    if (isFinalized) {
        menu.getItem(1).setEnabled(false);
        // You can also use something like:
        // menu.findItem(R.id.example_foobar).setEnabled(false);
    }
    return true;
}

Android 3.0以降では、メニュー項目がアクションバーに表示されるとき、オプションメニューは常に開いていると見なされます。イベントが発生し、メニューの更新を実行する場合は、invalidateOptionsMenu()を呼び出して、システムがonPrepareOptionsMenu()を呼び出すように要求する必要があります。

250
Vikas

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

オプションメニューを作成するときにアイテムを変数として保存し、そのプロパティを自由に変更できます。

private MenuItem securedConnection;
private MenuItem insecuredConnection;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.connect_menu, menu);
    securedConnection = menu.getItem(0);
    insecuredConnection =  menu.getItem(1);
    return true;
}

public void foo(){
       securedConnection.setEnabled(true);
}    
39
nir

@Vikasバージョンを簡素化する

@Override
public boolean onPrepareOptionsMenu (Menu menu) {

    menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
    return true;
}
5
Kosrat D. Ahmad

ナビゲーションドロワーで実行する場合の最適なソリューション

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        menu.setGroupVisible(0,false);
        return true;
    }
2
Prashant Gosai

AsyncTaskが完了したときに項目を有効または無効にするために、現在のメニューを更新する方法。

ユースケースでは、AsyncTaskがデータを読み込んでいる間にメニューを無効にする必要があり、すべてのデータを読み込んだ後、ユーザーが使用できるようにすべてのメニューを再度有効にする必要がありました。

これにより、アプリはデータの読み込み中にユーザーがメニュー項目をクリックできなくなりました。

最初に、状態変数を宣言します。変数が0の場合、メニューが表示され、その変数が1の場合、メニューは非表示になります。

private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.

その後、私のonCreateOptionsMenu()でこの変数をチェックします。1の場合はすべてのアイテムを無効にし、そうでない場合はすべて表示します

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);

        if(mMenuState==1){
            for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setVisible(false);
            }
        }else{
             for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setVisible(true);
            }
        }

        return super.onCreateOptionsMenu(menu);
    }

これで、アクティビティの開始時にonCreateOptionsMenu()が1回だけ呼び出され、開始時にアイテムの状態を設定したため、すべてのアイテムが削除されます。

次に、onPostExecute()でその状態変数を0に設定するAsyncTaskを作成します

この手順は非常に重要です!

invalidateOptionsMenu();を呼び出すと、onCreateOptionsMenu();が再起動します

したがって、状態を0に設定した後、すべてのメニューを再描画しますが、今回は0の変数を使用して、すべてのメニューが非同期プロセスが完了した後に表示され、ユーザーはメニューを使用できます。

 public class LoadMyGroups extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration. 

        }

        @Override
        protected Void doInBackground(Void... voids) {
           //Background work

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
            invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu

        }
    }

結果

enter image description here

2
  @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {

                case R.id.item_id:

                       //Your Code....

                        item.setEnabled(false);
                        break;
              }
            return super.onOptionsItemSelected(item);
     }
1
Tousif Akram

古い質問に対するより現代的な答え:

MainActivity.kt

private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
    if (new != old) invalidateOptionsMenu()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main_activity, menu)
    return super.onCreateOptionsMenu(menu)
}

override fun onPrepareOptionsMenu(menu: Menu): Boolean {
    menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
    return super.onPrepareOptionsMenu(menu)
}

menu_main_activity.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/action_my_action"
    Android:icon="@drawable/ic_my_icon_24dp"
    app:iconTint="@drawable/menu_item_icon_selector"
    Android:title="My title"
    app:showAsAction="always" />
</menu>

menu_item_icon_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:color="?enabledMenuIconColor" Android:state_enabled="true" />
<item Android:color="?disabledMenuIconColor" />

attrs.xml

<resources>   
    <attr name="enabledMenuIconColor" format="reference|color"/>
    <attr name="disabledMenuIconColor" format="reference|color"/>
</resources>

styles.xml or themes.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="disabledMenuIconColor">@color/white_30_alpha</item>
    <item name="enabledMenuIconColor">@Android:color/white</item>
1
ExpensiveBelly

メニューが表示されている場合

menu.findItem(R.id.id_name).setVisible(true);

メニューを非表示にする場合

menu.findItem(R.id.id_name).setVisible(false);
0
murugan mani
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    // getMenuInflater().inflate(R.menu.home, menu);
    return false;
}
0
user3913975