¿Cómo puedo forzar el método onPrepareOptionsMenu para disparar?

En el método onCreateOptionsMenu mi actividad, simplemente hincho mi archivo de diseño de menú y lo adjunto.

Quiero mostrar / ocultar algunos elementos de menú basados ​​en un valor a de una variable global, lo hago en el método onPrepareOptionsMenu . He leído que este es el lugar correcto para hacerlo.

Mi método onPrepareOptionsMenu no siempre se dispara. No sé por qué, pero no siempre se dispara cuando presiono el botón "Menú" en mi teléfono. Tal vez tiene algo que ver con su estado interno.

Parece que se dispara cuando se está creando la Acitvity. Al presionar el botón "Menú" por primera vez, no lo hace disparar, pero si presiono el botón de menú por segunda vez, funciona bien.

¿Hay una manera que podría forzar el onPrepareOptionsMenu para disparar.

Gracias


Smok sugirió utilizar el método invalidateOptionsMenu para invalidar los elementos del menú pero esto hace que el método onCreateOptionsMenu también se dispare. Aquí está mi método:

 @Override public boolean onCreateOptionsMenu(Menu menu) { System.out.println("onCreate"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.search, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconified(false); searchView.requestFocusFromTouch(); return true; } @Override public boolean onPrepareOptionsMenu (Menu menu) { System.out.println("prepared"); if (this.objAdapter == null) { menu.findItem(R.id.sort).setVisible(false); menu.findItem(R.id.filter).setVisible(false); menu.findItem(R.id.group).setVisible(false); } else { menu.findItem(R.id.sort).setVisible(true); menu.findItem(R.id.filter).setVisible(true); menu.findItem(R.id.group).setVisible(true); } return true; } 

Como se puede ver en mi método onCreateOptionsMenu , invocarlo de nuevo hará que el foco se pierda en el SearchView .

Como Smok señaló: llamando invalidateOptionsMenu() .

Tuve el mismo problema y me fijo con supportInvalidateOptionsMenu () método (porque uso la actividad de soporte), pero con una solución.

Tengo una variable de bandera que compruebo en el método onCreateOptionsMenu (menú de menú) de esta manera:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if (!IS_MENU_FIXED) { // Create menu only the first time the activity is loaded super.onCreateOptionsMenu(menu); getSupportMenuInflater().inflate(R.menu.main, menu); // Create menu items, etc... } return true; } 

Y esta es la forma en que llamo a supportInvalidateOptionsMenu () cuando se requiere:

 if (!IS_MENU_FIXED) { supportInvalidateOptionsMenu(); IS_MENU_FIXED = Boolean.TRUE; } 

Esta es la documentación oficial sobre este tema.

Saludos, Gabriel.

  • Edición de voz durante la llamada - Android
  • Cambiar la imagen del contacto a una foto grande a través de PHOTO_FILE_ID en Android
  • Determinar la existencia de la función Streetview de Google
  • Diferencia entre código antes y después de super ()
  • Android / Java: ¿Llamar a un método usando reflexión?
  • ¿Cómo puedo mantener vivo un hilo de conexión? (¿Necesito usar un daemon?)
  • Cómo comprobar el espacio disponible en el dispositivo Android? En la tarjeta SD?
  • Cómo sintetizar sonidos de piano en android / java
  • Error de conexión de anuncios: EOF (nuevo en android)
  • Apache POI insertar imagen
  • Creación de una función "favorita" en una lista de preguntas que se asignan al azar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.