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