Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cambiar el menú de opciones durante el tiempo de ejecución – invalidateOptionsMenu ()

Estoy creando un menú donde uno de los elementos se utiliza el bloqueo de un objeto. Cuando se hace clic en este elemento, el menú se debe volver a crear con un botón para desbloquear el elemento. He creado dos menús para esto. Esto está funcionando bien. He leído que en la versión de Android> = 11 el onPrepareOptionsMenu ya no se llama cuando se muestra el menú y tengo que llamar a invalidateOptionsMenu (). Así que cambié el objetivo de construcción (tanto en el manifiesto como en las propiedades) a 11 y corrió la aplicación en un AVD de 4.0.3. El programa sigue funcionando bien, pero pensé que ya no debería hacerlo, y debería comprobarlo

if (Build.VERSION.SDK_INT >= 11) { invalidateOptionsMenu(); } 

Este es mi código:

 public class MainActivity3 extends Activity{ boolean locked; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); locked = false; } @Override public boolean onCreateOptionsMenu(Menu menu){ MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.changing_menu1, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); MenuInflater inflater = getMenuInflater(); if (locked) { inflater.inflate(R.menu.changing_menu2, menu); } else { inflater.inflate(R.menu.changing_menu1, menu); } return super.onPrepareOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.Menu1: break; case R.id.Menu2 : break; case R.id.Menu3 : locked = !locked; break; } return true; } } 

Por lo tanto, el Menú sigue actualizado / recreado en 4.0. ¿He malentendido algo sobre el uso de invalidateOptionsMenu () ;?

  • Ampliar la actividad del cajón de navegación a otras actividades
  • Menú diferente para diferentes fragmentos
  • Implementación del menú deslizante J. Feinstein
  • Menú PROBLEMAS con algunos dispositivos Android 4.x
  • Cómo manejar ShareActionProvider evento onClick
  • Botón de menú de nido de abeja objetivo
  • ¿Cómo puedo actualizar el ActionBar cuando onPrepareOptionsMenu ha cambiado las entradas de menú?
  • Cómo eliminar iconos de un menú de desbordamiento de ActionBarSherlock en Android 2.3?
  • One Solution collect form web for “Cambiar el menú de opciones durante el tiempo de ejecución – invalidateOptionsMenu ()”

    invalidateOptionsMenu() se agregó para darnos la capacidad de forzar onCreateOptionsMenu() a ser llamado de nuevo. onPrepareOptionsMenu() todavía se llama cada vez que llama al menú.

    Lo que está tratando de lograr es un buen ejemplo de cuándo utilizar invalidateOptionsMenu() pero debido a la compatibilidad con versiones anteriores, tendrá que hacer ambas cosas:

     if (Build.VERSION.SDK_INT >= 11) { invalidateOptionsMenu(); } @Override public boolean onCreateOptionsMenu(Menu menu){ if (Build.VERSION.SDK_INT >= 11) { selectMenu(menu); } return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT < 11) { selectMenu(menu); } return true; } private void selectMenu(Menu menu) { menu.clear(); MenuInflater inflater = getMenuInflater(); if (locked) { inflater.inflate(R.menu.changing_menu2, menu); } else { inflater.inflate(R.menu.changing_menu1, menu); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.