2011-11-26 18 views

risposta

129

Dal momento che le azioni sono popolati da menu delle opzioni della propria attività è possibile utilizzare Activity#invalidateOptionsMenu(). Questo scaricherà il menu corrente e richiamerà i metodi onCreateOptionsMenu/onPrepareOptionsMenu della tua attività per ricostruirlo.

Se si utilizzano schede della barra delle azioni per modificare la configurazione del frammento, esiste un modo migliore. Chiedi a ciascun frammento di gestire la propria porzione del menu. Questi frammenti dovrebbero chiamare setHasOptionsMenu(true). Quando vengono aggiunti o rimossi i frammenti con voci di menu opzioni, il sistema invalida automaticamente il menu delle opzioni e chiama i metodi onCreateOptionsMenu/onPrepareOptionsMenu di ciascun frammento in aggiunta a quelli dell'attività. In questo modo ogni frammento può gestire i propri oggetti e non è necessario preoccuparsi di eseguire il cambio di menu a mano.

+17

Solo una nota: setHasOptionsMenu() dovrebbe essere chiamato in onCreate secondo la [documentazione] (http://developer.android.com/guide/topics/fundamentals/fragments.html#ActionBar). – Dave

+1

Questo non è in realtà un requisito. Può essere chiamato da lì ed è un buon posto per farlo in molte circostanze, ma se il frammento è già stato aggiunto e non è nascosto, il menu delle opzioni dell'attività verrà invalidato e il nuovo stato verrà riflesso. – adamp

+2

Sono d'accordo con te, tuttavia i documenti non lo fanno sembrare così. "Affinché questo metodo possa ricevere chiamate, tuttavia, è necessario chiamare setHasOptionsMenu() durante onCreate() ...". Penso che significhino che tu debba chiamare setHasOptionsMenu(), ma che involontariamente hanno fatto sembrare che durante onCreate() fosse anche un requisito. – Dave

1

ActionMode.invalidate() ha fatto il trucco. Ha causato il onPrepareActionMode() da richiamare.

Activity#invalidateOptionsMenu() fatto non la causa onPrepareActionMode() da richiamare quando si utilizzano voci di elenco con selezione multipla.

+0

come si ottiene la modalità di azione? Ho solo ActionBar – eugene

+0

ActionMode è il primo parametro in onPrepareActionMode (...): http: // goo.gl/tMyBx –

+0

Non ho mai sentito parlare di onPrepareAction –

15

Activity.invalidateOptionsMenu() richiede API Level 11. C'è una soluzione più semplice, che è compatibile:

Aggiungere il MenuItem al menu inizialmente, ma impostare la sua visibilità a falso. Set visibilità a vero quando desiderato, utilizzando MenuItem.setVisible()

+1

Grazie. Nel caso in cui aiuti gli altri ... Metti 'MenuItem refreshItem = menu.findItem (R.id.action_refresh); refreshItem.setVisible (false); 'nel tuo' onCreateOptionsMenu' – AlvaroSantisteban

+0

@AlvaroSantisteban o '" android: visible "=" false "' in xml –

1

Activity.invalidateOptionsMenu() richiede livello di API 11. Utilizzare la versione della libreria di supporto di esso supportInvalidateOptionsMenu().

AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.supportInvalidateOptionsMenu(); 
Problemi correlati