2012-07-10 10 views
18

Ho un problema di base in cui un MenuItem inizialmente nascosto non può essere commutato a visibile. Come avvertimento, sto usando ActionBarSherlock, ma volevo vedere se qualcuno sapeva se si trattava di un problema noto di Android o sto facendo qualcosa di terribile prima di verificare se si tratta di un problema all'interno di ABS. Codice come segue:Inizialmente Menu nascostoItem Not Shown Quando setVisible (true) è chiamato

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

Ho anche cercato di spostare l'assegnazione mMenuItem e visibilità in una chiamata a onPrepareOptionsMenu ma è mostrato lo stesso comportamento.

Grazie!

+0

È solo l'menu_item non viene visualizzato o l'intero menu_xml non viene visualizzato? Perché stai gonfiando il menu_xml, ma non vedo dove lo stai usando o aggiungendolo a qualcosa. – Scen

+0

Non è necessario collegarlo a qualcosa, vero? Il MenuInflater si prende cura di questo? – PolandSpring

+0

Sto usando ABS e sono stato in grado di mostrare o nascondere il menu senza problemi. Anche se il mio menu è stato aggiunto per codice, anziché gonfiato da xml. Prova il vecchio modo di aggiungere menu: menu.add (...). SetIcon(). SetShowAsAction(); – azgolfer

risposta

23

Il problema è che non stai dicendo ad Android che è necessario aggiornare il menu. Questo mi ha fatto impazzire per l'ultima ora fino a quando ho trovato una soluzione. Non penso che sia così evidente su pre-HC perché le voci di menu non sono sempre visibili sullo schermo come se fossero in HC +.

sulla vostra attività, è sufficiente chiamare:

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

che attiverà di nuovo una chiamata al onCreateOptionsMenu() evento, quindi se si sta impostando la visibilità in quella funzione per l'inizializzazione è necessario prendere in considerazione quindi se si desidera che l'opzione di mostrare o meno.

+8

* supportInvalidateOptionsMenu() (Sta usando ABS) – HandlerExploit

+0

L'ABS mai visto quindi non potrebbe dirvi le specifiche lì. –

+0

http://actionbarsherlock.com/ – HandlerExploit

6

Ho avuto lo stesso problema e ho scoperto che setVisible(true) funziona quando c'è almeno un altro MenuItem visibile. Spero che questo possa essere utile a qualcuno.

+0

Nel mio caso, ci devono essere almeno * 3 * elementi visibili affinché setVisible o setEnabled funzionino. – lenooh

1

ho trovato che l'uso di un posto di vista del metodo (Runnable) per setVisible fa il trucco, quindi qualcosa di simile ...

view.post(new Runnable() { 

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

      }); 
1

Capisco che sia vecchia domanda.
Ma ho risolto mettendo dentro onPrepareOptionMenu() {...}

private boolean mShowVisible=false; 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

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

    return super.onPrepareOptionsMenu(menu); 
} 

ogni volta che si desidera impostare visibile o meno lo chiamano semplicemente come:

mShowVisible = true; // or false 
invalidateOptionMenu(); 
Problemi correlati