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