risposta-alla-domanda-sullo-sviluppo-web-bd.com

Android - Come modificare dinamicamente il testo della voce di menu al di fuori di onOptionsItemselected o onCreateOptionsMenu

Sto cercando di cambiare il titolo di una voce di menu al di fuori del metodo onOptionsItemSelected(MenuItem item).

Io faccio già quanto segue;

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

tuttavia mi piacerebbe essere in grado di modificare il titolo di una particolare voce di menu al di fuori di questo metodo.

190
Garbit

Suggerirei di mantenere un riferimento all'interno dell'attività sull'oggetto Menu ricevuto in onCreateOptionsMenu e quindi utilizzarlo per recuperare l'oggetto Menu che richiede la modifica come e quando ne hai bisogno. Ad esempio, potresti fare qualcosa seguendo le linee di seguito indicate:

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

}

In alternativa, è possibile sovrascrivere onPrepareOptionsMenu per aggiornare le voci del menu ogni volta che viene visualizzato il menu.

359
Charles Harley

Come suggerito da JxDarkAngel, chiamandolo da qualsiasi parte della tua attività ,

invalidateOptionsMenu();

e poi sovrascrivendo:

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

è una scelta molto migliore. Ho usato la risposta da https://stackoverflow.com/a/17496503/568197

101
Todd DeLand

puoi farlo creando un oggetto "Menu" globale e assegnandolo in onCreateOptionMenu

public class ExampleActivity extends AppCompatActivity
    Menu menu;

quindi assegna qui

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

Successivamente, utilizzare l'oggetto Menu assegnato per ottenere gli elementi richiesti

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

Crea un metodo setOptionsTitle () e imposta un campo nella tua classe. Ad esempio:

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

...

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

}

Ora quando il menu viene popolato, cambia il titolo in qualunque stato sia:

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

        menu.add(bedStatus);


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

È meglio utilizzare l'override di 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");
   }

Qui un esempio

3
JxDarkAngel

Dichiara il tuo campo di menu.

private Menu menu;

Di seguito è il metodo 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);
}

Seguirà la tua attività di setter. Tramite un clic del mouse o tramite il codice condizionale

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

Questo ha funzionato per me.

2
hyperCoder

Per le persone che hanno bisogno del titolo impostato staticamente. Questo può essere fatto in AndroidManifest.xml

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

Options Menu Title Text

0
moberme

Avevo bisogno di cambiare l'icona del menu per il frammento. Ho modificato la risposta di Charles a questa domanda un po 'per il frammento:

    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

Mi sembra che tu voglia cambiare il contenuto del menu all'interno di un metodo locale e questo metodo viene chiamato in qualsiasi momento, ogni volta che si verifica un evento o nel thread dell'interfaccia utente dell'attività.

Perché non prendi l'istanza di Menu nella variabile globale in onPrepareOptionsMenu quando questo viene sovrascritto e usato in questo tuo metodo. Assicurarsi che questo metodo venga chiamato ogni volta che si verifica un evento (come il clic del pulsante) o nel thread dell'interfaccia utente dell'attività, nel gestore o nell'attività asincrona post-esecuzione.

È necessario conoscere in anticipo l'indice di questa voce di menu che si desidera modificare. Dopo aver cancellato il menu, devi gonfiare il menu XML e aggiornare il nome o l'icona del tuo articolo.

0
Abhinav Saxena