studio opciones onprepareoptionsmenu menus item emergente ejemplos dinamico android menu

android - onprepareoptionsmenu - Cambiar el menú de opciones durante el tiempo de ejecución-invalidateOptionsMenu()



oncreateoptionsmenu fragment (1)

Estoy creando un menú donde uno de los elementos se utiliza para bloquear un objeto. Cuando se hace clic en este elemento, el menú debe volver a crearse con un botón para desbloquear el elemento. He creado dos menús para esto. Esto está funcionando bien. Leí que en la versión de Android> = 11 el onPrepareOptionsMenu ya no se llama cuando se muestra el menú y debo llamar a invalidateOptionsMenu (). Así que cambié el objetivo de compilación (tanto en el Manifiesto como en las propiedades) a 11 y ejecuté la aplicación en un AVD de 4.0.3. El programa todavía funciona bien, pero pensé que ya no debería, y debería verificar

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ú aún se actualiza / vuelve a crear en 4.0. ¿Entendí mal algo sobre el uso de invalidateOptionsMenu () ;?


Se agregó invalidateOptionsMenu() para darnos la capacidad de forzar a onCreateOptionsMenu() a que se vuelva a llamar. Se sigue llamando a onPrepareOptionsMenu() cada vez que llama al menú.

Lo que intentas lograr arriba es un buen ejemplo de cuándo usar invalidateOptionsMenu() pero debido a la compatibilidad con versiones anteriores, deberás 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); } }