¿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.
- Leer y grabar datos a través del puerto USB en Android 3.1
- JSONException: no hay valor para XYZ al intentar getString ("XYZ")
- Selector de color de Android
- Cómo descodificar la cadena base64 y convertirla en pdf / jpg y guardarla en almacenamiento
- Entrada duplicada: org / appcelerator / titanium / gen / bindings.json en el módulo Android personalizado
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
.
- ¿Por qué el método onNewIntent (intento de intención) es llamado dos veces?
- Android cómo llamar a startActivityForResult dentro de un adaptador
- Calcular la distancia real recorrida por el móvil
- ¿Cómo uncheck artículos en AlertDialog (setMultiChoiceItems)?
- GlCreateShader y glCreateProgram fallan en android
- Problema de ManagedQuery () obsoleto
- Error de conexión: ECONNREFUSED
- Capture la pantalla de Android y cree el video programáticamente
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.
- Android: ¿cómo obtener algún evento de KeyPress con ejemplo?
- Comunicación entre dos aplicaciones usando emulador como servidor y cliente