2012-07-10 5 views
18

Tengo un problema básico en el que un elemento de menú inicialmente oculto no se puede cambiar a visible. Como advertencia, estoy usando ActionBarSherlock, pero quería ver si alguien sabía si esto era un problema conocido de Android o si estoy haciendo algo terrible antes de investigar si este es un problema dentro de ABS. Código de la siguiente manera:MenuItem oculto inicialmente no se muestra cuando se llama a setVisible (verdadero)

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.menu_xml, menu); 

    mMenuItem = menu.findItem(R.id.menu_item); 
    mMenuItem.setVisible(false); 

    return true; 
} 

// Somewhere elsewhere 
// MenuItem is never visible after this line is executed 
mMenuItem.setVisible(true); 

También he intentado mover la asignación mMenuItem y visibilidad en una llamada a onPrepareOptionsMenu pero se muestra el mismo comportamiento.

Gracias!

+0

¿Es sólo menu_item que no se muestra o no se muestra todo el menu_xml? Porque estás inflando el menu_xml, pero no veo dónde lo estás usando o lo estás agregando a nada. – Scen

+0

No necesita adjuntarlo a nada, ¿verdad? El MenuInflater se ocupa de eso? – PolandSpring

+0

Estoy usando ABS y pude mostrar u ocultar el menú sin problemas. Aunque mi elemento de menú se agrega por código, en lugar de inflarlo por xml. Pruebe la forma antigua de agregar menú: menu.add (...). SetIcon(). SetShowAsAction(); – azgolfer

Respuesta

23

El problema es que no le está diciendo a Android que necesita actualizar el menú. Esto me volvió loco durante la última hora hasta que encontré una solución. No creo que sea tan evidente en pre-HC porque los elementos del menú no siempre son visibles en la pantalla como en HC +.

En su actividad, simplemente llame a:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
this.invalidateOptionsMenu(); 
} 

que activará una llamada a la onCreateOptionsMenu() evento de nuevo, por lo que si va a configurar la visibilidad en esa función de inicialización que necesita para tomar en cuenta si quieres que la opción se muestre o no.

+8

* supportInvalidateOptionsMenu() (Él está utilizando ABS) – HandlerExploit

+0

ABS nunca visto, por lo que no podría decirles detalles. –

+0

http://actionbarsherlock.com/ – HandlerExploit

6

Tuve el mismo problema y descubrí que setVisible(true) funciona cuando hay al menos otra MenuItem visible. Espero que esto pueda ser útil para alguien.

+0

En mi caso, debe haber al menos * 3 * elementos visibles para que setVisible o setEnabled funcionen. – lenooh

1

He encontrado que el uso de un puesto de vista método (Ejecutable) a setVisible hace el truco, así que algo como ...

view.post(new Runnable() { 

       @Override 
       public void run() { 
        menu.findItem(id).setVisible(true); 
       } 

      }); 
1

Entiendo que esto es cuestión de edad.
Pero he resuelto mediante la colocación en el interior onPrepareOptionMenu() {...}

private boolean mShowVisible=false; 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    menu.findItem(R.id.menu_item).setVisible(mShowVisible); 

    return super.onPrepareOptionsMenu(menu); 
} 

cada vez que desee establecer visible o no a llamarlo como:

mShowVisible = true; // or false 
invalidateOptionMenu(); 
Cuestiones relacionadas