375 Stimmen

Wie kann ich ein Menüelement in der Aktionsleiste ausblenden?

Ich habe eine Aktionsleiste mit einem Menüpunkt. Wie kann ich diesen Menüpunkt aus-/einblenden?

Das ist es, was ich zu tun versuche:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();

7voto

Chanaka Fernando Punkte 2008

Laut der offiziellen Seite von Android Developer wird OnCreateOptionMenu (Menümenü) nicht empfohlen, um Menüpunkte, Symbole, Sichtbarkeit usw. zur Laufzeit zu ändern.

Nachdem das System onCreateOptionsMenu() aufgerufen hat, behält es eine Instanz des von Ihnen eingegebenen Menüs bei und ruft onCreateOptionsMenu() nicht erneut auf, es sei denn, das Menü wird aus irgendeinem Grund ungültig. Sie sollten onCreateOptionsMenu() jedoch nur verwenden, um den Anfangszustand des Menüs zu erstellen und nicht, um Änderungen während des Lebenszyklus der Aktivität vorzunehmen.

Wenn Sie das Optionsmenü auf der Grundlage von Ereignissen, die während des Lebenszyklus der Aktivität auftreten, ändern möchten, können Sie dies mit der Methode onPrepareOptionsMenu() tun. Diese Methode übergibt Ihnen das Menü-Objekt in seinem aktuellen Zustand, damit Sie es ändern können, z. B. Elemente hinzufügen, entfernen oder deaktivieren. (Fragmente bieten auch einen onPrepareOptionsMenu()-Callback). --AndroidDeveloper Official Site --

Wie empfohlen können Sie dies verwenden onOptionsItemSelected(MenuItem item) Methode verfolgen Benutzereingaben.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.edit) {
        Intent intent = new Intent(this, ExampleActivity.class);
        intent.putExtra(BUNDLE_KEY, mConnection);
        startActivityForResult(intent, PICK_CHANGE_REQUEST);
        return true;
    } else if (id == R.id.delete) {
        showDialog(this);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

Wenn Sie die Menüpunkte während der Laufzeit ändern müssen, können Sie mit onPrepareOptionsMenu(Menü menu) sie zu ändern

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (Utils.checkNetworkStatus(ExampleActivity.this)) {
        menu.findItem(R.id.edit).setVisible(true);
        menu.findItem(R.id.delete).setVisible(true);
    }else {
        menu.findItem(R.id.edit).setVisible(false);
        menu.findItem(R.id.delete).setVisible(false);
    }
    return true;
}

7voto

Hiram Punkte 2580

Die Antwort von P1r4nh4 funktioniert gut, ich habe sie nur mit einem booleschen Flag vereinfacht:

public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == 1) //1 is true, 0 is false
    {
        //hide only option 2
            menu.getItem(2).setVisible(false);
    }
}

5voto

Ajeet Yadav Punkte 693

Sie können verwenden toolbar.getMenu().clear(); um alle Menüpunkte auf einmal auszublenden

4voto

Shimon Doodkin Punkte 3946

https://stackoverflow.com/a/21215280/466363 - beantwortet von Look Alterno und Sufian

  • ActivityCompat.invalidateOptionsMenu() hat keinen Callback onPrepareOptionsMenu() auf; sie aktualisiert das Menü direkt.
  • Meine someMethod() wird von mehreren Stellen aus aufgerufen, sogar bevor onCreateOptionsMenu(), also muss ich prüfen, ob mMenu != null ist.
  • sollte mit API 8 funktionieren

.

private Menu mMenu;
   @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       inflater.inflate(R.menu.track_fragment, menu);
       mMenu = menu;
       }
   ...
   private void someMethod() {
   ...
       if (mMenu != null) {
          MenuItem item = mMenu.findItem(R.id.new_track);
          if (item != null) {
               item.setVisible(false);
               ActivityCompat.invalidateOptionsMenu(this.getActivity());
           }
       }
   ...
   }
  • ActivityCompat.invalidateOptionsMenu() hat keinen Callback onPrepareOptionsMenu() auf; sie aktualisiert das Menü direkt.

  • Meine someMethod() wird von mehreren Stellen aus aufgerufen, sogar bevor onCreateOptionsMenu(), also muss ich prüfen, ob mMenu != null ist.

  • sollte mit API 8 funktionieren

4voto

Hantash Nadeem Punkte 438

Wenn Sie die Sichtbarkeit aller Elemente im Menü einstellen, wird das Menü der Anwendungsleiste oder das Überlaufmenü automatisch ausgeblendet.

Beispiel

private Menu menu_change_language;

...

...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    ...
    menu_change_language = menu;
    menu_change_language.findItem(R.id.menu_change_language)
           .setVisible(true);

    return super.onCreateOptionsMenu(menu);
}

Bevor Sie zu einem anderen Fragment gehen, verwenden Sie den folgenden Code:

if(menu_change_language != null){                 
    menu_change_language.findItem(R.id.menu_change_language)
       .setVisible(false);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X