item from change activity java android menu menuitem

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



invalidate menu android (8)

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.


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://.com/a/17496503/568197


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


Declara tu campo de menú.

private Menu menu;

A continuación está el método 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); }

Lo siguiente será su actividad de establecimiento de nombre. Ya sea mediante un clic del botón o mediante un código condicional

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

Esto funcionó para mí.


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.


Para las personas que necesitan el título establecido estáticamente. Esto se puede hacer en AndroidManifest.xml

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


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