2012-09-20 11 views
6

Per qualche motivo, onCreateOptionsMenu() viene chiamato DOPO onResume() nella mia app ... Pertanto, non riesco a ottenere una sospensione del menu mentre sto impostando la mia interfaccia utente (tra onCreate() e onResume()), che si traduce in non essere in grado di impostare gli elementi di azione corrispondenti per la mia ActionBar ...Come ottenere una sospensione del menu ActionBar al momento della configurazione dell'interfaccia utente?

L'unica soluzione che ho trovato finora è chiamare manualmente invalidateOptionsMenu() appena prima dei ritorni onCreate(); in questo modo viene chiamato immediatamente onCreateOptionsMenu(), ottengo una sospensione del menu e quindi posso finalmente aggiungere gli elementi di azione desiderati.

Qualcuno ha riscontrato questo problema? Come si suppone di impostare in modo programmatico i propri elementi di azione dato che onCreateOptionsMenu() viene chiamato dopo onResume()?

La mia app è in esecuzione su Jellybean, utilizza il built-in ActionBar (senza ActionBarSherlock), android:minSdkVersion="14" e android:targetSdkVersion="16"

+0

controllo di integrità rapida, si sta parlando di attività * * onCreate & onResume, giusto? in contrasto con i metodi corrispondenti in Fragment –

+0

Perché non puoi configurare le voci di menu in 'onCreateOptionsMenu()' (invece di usarlo semplicemente per memorizzare un riferimento al menu per un uso successivo)? – user113215

+1

Sono qui con user113215 qui, perché è necessario conoscere il menu in 'onResume()'? Non sembra giusto. – dmon

risposta

6

in primo luogo considerare che forse non si dovrebbe fare questo. Sembra che la tua idea possa andare contro i modelli di design tipici per Android. Se il tuo menu sta cambiando in risposta a una selezione utente, ad esempio, dovresti utilizzare invece la modalità di azione contestuale.

  • Dal Action Bar API Guide:

    Come regola generale, tutte le voci del menu Opzioni (lasciare elementi di azione da solo) dovrebbero avere un impatto globale sul app, piuttosto che riguardano solo una piccola parte dell'interfaccia. [...] Quindi, anche prima di decidere se una voce di menu debba apparire come una voce di azione, assicurarsi che l'oggetto abbia un ambito globale per l'attività corrente.

  • Dal Menu API Guide:

    Non si dovrebbe mai cambiare le voci del menu opzioni in base al View attualmente a fuoco. In modalità touch (quando l'utente non utilizza trackball o d-pad), le visualizzazioni non possono essere messe a fuoco, quindi non si dovrebbe mai usare la messa a fuoco come base per la modifica degli elementi nel menu delle opzioni. Se si desidera fornire voci di menu sensibili al contesto su un, utilizzare Context Menu.


A parte ciò, se si desidera modificare le voci di menu come avete descritto, si dovrebbe apportare la modifica in onPrepareOptionsMenu(). Quando si verifica l'evento che richiede la modifica delle voci di menu, inserire le informazioni pertinenti in un campo e chiamare invalidateOptionsMenu(). Sostituire onPrepareOptionsMenu() e controllare il valore del campo per determinare quali voci di menu aggiungere/rimuovere.

(Funzionerebbe anche per chiamare invalidateOptionsMenu() e sostituire onCreateOptionsMenu() per modificare quali voci di menu devono essere visualizzate, anche se questo approccio non è raccomandato.)

più dalla Menu API Guide:

Si dovrebbe usare onCreateOptionsMenu() solo per creare lo stato menù iniziale e di non fare modifiche durante il ciclo di vita di attività. Se si desidera modificare il menu delle opzioni in base agli eventi che si verificano durante il ciclo di vita dell'attività, è possibile farlo nel metodo onPrepareOptionsMenu().

Questo metodo consente di passare l'oggetto Menu così com'è attualmente in modo che sia possibile modificare , ad esempio aggiungere, rimuovere o disabilitare elementi. (Frammenti anche forniscono un onPrepareOptionsMenu() callback.)

  • Su 2.3.x Android e più bassa, il sistema chiama onPrepareOptionsMenu() ogni volta che l'utente apre il menu delle opzioni (preme il pulsante Menu).

  • Su Android 3.0 e versioni successive, il menu delle opzioni viene considerato come sempre aperto quando le voci di menu sono presentate nella barra delle azioni. Quando si verifica un evento e si desidera eseguire un aggiornamento del menu, è necessario chiamare invalidateOptionsMenu() per richiedere che la chiamata di sistema onPrepareOptionsMenu().

+0

Ottima risposta, grazie MOLTO per il tuo contributo :) –

Problemi correlati