it-swarm.com.de

Android: Wie kann ich das Optionsmenüelement beim Klicken mit der Taste aktivieren/deaktivieren?

Ich kann das leicht machen, wenn ich onCreateOptionsMenu- oder onOptionsItemSelected-Methoden verwende.

Ich habe jedoch eine Schaltfläche irgendwo im Bildschirm, und wenn Sie auf diese Schaltfläche klicken, sollten Sie Kontextmenüelemente aktivieren/deaktivieren.

112
Vikas

Wie auch immer, die Dokumentation deckt alle Dinge ab.

Menüpunkte zur Laufzeit ändern

Sobald die Aktivität erstellt wurde, wird die Die onCreateOptionsMenu()-Methode wird aufgerufen nur einmal wie oben beschrieben. Das Menu Sie .__ behält und verwendet das System wieder Definieren Sie in dieser Methode, bis Ihr Aktivität wird zerstört. Wenn du möchtest Ändern Sie das Optionsmenü jederzeit nach es wird zuerst erstellt, Sie müssen .__ überschreiben. die onPrepareOptionsMenu()-Methode . Dies übergibt Ihnen das Menu-Objekt als derzeit existiert Dies ist nützlich, wenn Sie möchten entfernen, hinzufügen, deaktivieren oder Aktivieren Sie Menüelemente in Abhängigkeit von aktueller Stand Ihrer Bewerbung.

Z.B. 

@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;
}

Bei Android 3.0 und höher gilt das Optionsmenü als immer geöffnet, wenn Menüelemente in der Aktionsleiste angezeigt werden. Wenn ein Ereignis eintritt und Sie eine Menüaktualisierung durchführen möchten, müssen Sie invalidateOptionsMenu() aufrufen, um den Systemaufruf onPrepareOptionsMenu() anzufordern.

243
Vikas

Bei allen Android-Versionen ist der einfachste Weg: Verwenden Sie diese Option, um ein Menüaktionssymbol als deaktiviert anzuzeigen, und FUNKTION als deaktiviert zu setzen:

@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);
    }
}
57
Frank

Sie können das Element beim Erstellen des Optionsmenüs als Variable speichern und dann die Eigenschaften nach Belieben ändern.

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 Version vereinfachen 

@Override
public boolean onPrepareOptionsMenu (Menu menu) {

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

die beste Lösung wenn Sie in der Navigationsleiste arbeiten

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

So aktualisieren Sie das aktuelle Menü, um die Elemente zu aktivieren oder zu deaktivieren, wenn eine AsyncTask abgeschlossen ist.

In meinem Anwendungsfall musste ich mein Menü deaktivieren, während mein AsyncTask Daten geladen hat. Nachdem alle Daten geladen wurden, musste ich das gesamte Menü erneut aktivieren, damit der Benutzer es verwenden kann.

Dies hinderte die App daran, dass Benutzer auf Menüelemente klicken, während Daten geladen wurden.

Zuerst deklariere ich eine Zustandsvariable, wenn die Variable 0 ist, wird das Menü angezeigt, wenn diese Variable 1 ist, ist das Menü ausgeblendet.

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

Dann überprüfe ich in meiner onCreateOptionsMenu(), ob diese Variable 1 ist, ich deaktiviere alle meine Artikel, wenn nicht, zeige ich sie alle

 @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);
    }

Wenn jetzt meine Aktivität beginnt, wird onCreateOptionsMenu() nur einmal aufgerufen, und alle meine Artikel werden gelöscht, da ich zu Beginn den Status für sie festgelegt habe.

Dann erstelle ich eine AsyncTask, bei der ich diese Zustandsvariable in meiner onPostExecute() auf 0 setze. 

Dieser Schritt ist sehr wichtig!

Wenn Sie invalidateOptionsMenu(); aufrufen, wird onCreateOptionsMenu(); erneut gestartet.

Nachdem ich meinen Status auf 0 gesetzt habe, zeichne ich einfach das gesamte Menü neu, aber diesmal mit meiner Variablen auf 0, die besagt, dass das gesamte Menü angezeigt wird, nachdem der asynchrone Prozess abgeschlossen ist. Anschließend kann mein Benutzer das Menü verwenden .

 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

        }
    }

Ergebnisse

 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

Eine modernere Antwort auf eine alte Frage:

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

Wenn sichtbares Menü

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

Wenn Menü ausblenden

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