it-swarm.com.de

Android - So ändern Sie den Menüelementtext dynamisch außerhalb von onOptionsItemselected oder onCreateOptionsMenu

Ich versuche, den Titel eines Menüelements außerhalb der onOptionsItemSelected(MenuItem item) -Methode zu ändern.

Ich mache schon folgendes;

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

ich möchte jedoch in der Lage sein, den Titel eines bestimmten Menüelements außerhalb dieser Methode zu ändern.

197
Garbit

Ich würde vorschlagen, einen Verweis innerhalb der Aktivität auf das Menu-Objekt zu behalten, das Sie in onCreateOptionsMen erhalten, und diesen dann zu verwenden, um das MenuItem abzurufen, für das die Änderung bei Bedarf erforderlich ist. Sie können beispielsweise folgende Aktionen ausführen:

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String outOfBedMenuTitle = "Set to 'Out of bed'";
  private boolean inBed = false;

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // Create your menu...

    this.menu = menu;
    return true;
  }

  private void updateMenuTitles() {
    MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
    if (inBed) {
      bedMenuItem.setTitle(outOfBedMenuTitle);
    } else {
      bedMenuItem.setTitle(inBedMenuTitle);
    }
  }

}

Alternativ können Sie onPrepareOptionsMen überschreiben, um die Menüelemente jedes Mal zu aktualisieren, wenn das Menü angezeigt wird.

364
Charles Harley

Wie JxDarkAngel vorgeschlagen hat, rufen Sie dies von einer beliebigen Stelle in Ihrer Aktivität auf .

invalidateOptionsMenu();

und dann überschreiben:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  int savedRoute = mPrefs.getInt(getString(R.string.saved_route), 0);
  if (savedRoute > 0) {
    menu.findItem(R.id.action_route).setTitle("Route " + savedRoute);
  }
  return super.onPrepareOptionsMenu(menu);
}

ist eine viel bessere Wahl. Ich habe die Antwort von https://stackoverflow.com/a/17496503/568197 verwendet

103
Todd DeLand

sie können dazu ein globales "Menu" -Objekt erstellen und es dann in onCreateOptionMenu zuweisen

public class ExampleActivity extends AppCompatActivity
    Menu menu;

dann hier zuweisen

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    this.menu = menu;
    return true;
}

Verwenden Sie später das zugewiesene Menüobjekt, um die erforderlichen Elemente abzurufen

menu.findItem(R.id.bedSwitch).setTitle("Your Text");
9
Pranav Raut

Erstellen Sie eine setOptionsTitle () -Methode und legen Sie ein Feld in Ihrer Klasse fest. Sowie:

String bedStatus = "Set to 'Out of Bed'";

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}

Wenn das Menü nun ausgefüllt ist, ändern Sie den Titel in Ihren Status:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(bedStatus);


        // Return true so that the menu gets displayed.
        return true;
    }
5
Jack

Verwenden Sie besser die Überschreibung onPrepareOptionsMenu

menu.Clear ();
   if (TabActual == TabSelec.Anuncio)
   {
       menu.Add(10, 11, 0, "Crear anuncio");
       menu.Add(10, 12, 1, "Modificar anuncio");
       menu.Add(10, 13, 2, "Eliminar anuncio");
       menu.Add(10, 14, 3, "Actualizar");
   }
   if (TabActual == TabSelec.Fotos)
   {
       menu.Add(20, 21, 0, "Subir foto");
       menu.Add(20, 22, 1, "Actualizar");
   }
   if (TabActual == TabSelec.Comentarios)
   {
       menu.Add(30, 31, 0, "Actualizar");
   }

Hier ein Beispiel

3
JxDarkAngel

Ich verwende diesen Code, um mein unteres Navigationselement anzupassen

BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");
3
Oumar

Deklarieren Sie Ihr Menüfeld.

private Menu menu;

Es folgt die Methode onCreateOptionsMenu ()

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

Es folgt Ihre Aktivität als Name-Setter. Entweder durch einen Knopfdruck oder durch bedingten Code

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

Das hat bei mir funktioniert.

2
hyperCoder

Für Leute, die den Titel statisch setzen müssen. Dies kann in der AndroidManifest.xml erfolgen

<activity
    Android:name=".ActivityName"
    Android:label="Title Text" >
</activity>

Options Menu Title Text

0
moberme

Ich musste das Menüsymbol für das Fragment ändern. Ich habe Charles 'Antwort auf diese Frage für das Fragment ein wenig geändert:

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }
0
Almaz Vildanov

Es scheint mir, dass Sie den Inhalt des Menüs innerhalb einer lokalen Methode ändern möchten, und diese Methode wird jederzeit aufgerufen, wenn ein Ereignis eintritt, oder im Thread der Aktivitäts-Benutzeroberfläche.

Warum nehmen Sie nicht die Instanz von Menu in der globalen Variablen in onPrepareOptionsMenu, wenn diese überschrieben und in Ihrer Methode verwendet wird. Stellen Sie sicher, dass diese Methode immer dann aufgerufen wird, wenn ein Ereignis eintritt (z. B. durch Klicken auf eine Schaltfläche) oder wenn in der Benutzeroberfläche der Aktivität ein Thread, ein Handler oder eine asynchrone Task nach der Ausführung ausgeführt wird.

Sie sollten den Index dieses Menüpunkts, den Sie ändern möchten, im Voraus kennen. Nach dem Löschen des Menüs müssen Sie das XML-Menü aufblasen und den Namen oder das Symbol Ihres Elements aktualisieren.

0
Abhinav Saxena