java - item - oncreateoptionsmenu fragment




Android-Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu (6)

Como sugirió JxDarkAngel, llamando esto desde cualquier lugar de tu Actividad ,

invalidateOptionsMenu();

y luego anulando:

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

es una opción mucho mejor. Utilicé la respuesta de https://stackoverflow.com/a/17496503/568197

Estoy intentando cambiar el título de un elemento de menú desde fuera del onOptionsItemSelected(MenuItem item) elemento de elemento de menú onOptionsItemSelected(MenuItem item) .

Ya hago lo siguiente;

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

sin embargo, me gustaría poder modificar el título de un elemento de menú particular fuera de este método.


Cree un método setOptionsTitle () y establezca un campo en su clase. Como:

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

...

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

}

Ahora cuando el menú se llena, cambie el título a cualquiera que sea su estado:

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

        menu.add(bedStatus);


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

Es mejor que use la anulación 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");
   }

Aquí un ejemplo


Me parece que desea cambiar el contenido del menú dentro de un método local, y este método se invoca en cualquier momento, cada vez que se produce un evento o en el hilo de la IU de actividad.

¿Por qué no toma la instancia de Menú en la variable global en onPrepareOptionsMenu cuando esto se anula y utiliza en este método suyo? Asegúrese de llamar a este método cada vez que se produzca un evento (como un clic en el botón) o en la actividad UI thread, handler o async-task después de la ejecución.

Debe saber de antemano el índice de este elemento de menú que desea cambiar. Después de borrar el menú, debe inflar el menú XML y actualizar el nombre o icono de su elemento.


Sugeriría mantener una referencia dentro de la actividad al objeto de menú que recibes onCreateOptionsMenu y luego usar eso para recuperar el elemento de menú que requiere el cambio cuando lo necesites. Por ejemplo, podría hacer algo como lo siguiente:

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

}

Alternativamente, puede anular onPrepareOptionsMenu para actualizar los elementos del menú cada vez que se muestra el menú.


puede hacer esto crear un objeto "Menú" global y luego asignarlo en onCreateOptionMenu

public class ExampleActivity extends AppCompatActivity
    Menu menu;

luego asigne aquí

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

Luego, luego usa el objeto de menú asignado para obtener los artículos requeridos

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




menuitem