2012-04-15 14 views
10

Sto utilizzando ActionBar con un menu a discesa e onNavigationItemSelected() viene chiamato non appena viene creata l'attività, quindi viene chiamato il primo elemento. Il primo elemento del menu a discesa è Home, la stessa azione che viene eseguita premendo l'icona dell'applicazione con android.R.id.home in modo che all'avvio dell'applicazione vengano chiamate automaticamente. Per evitare che ciò accada ho questo codice:onNavigationItemSelected in ActionBar viene richiamato all'avvio come può evitarlo?

if(this.getClass() != FrecView.class){ //if i am not currently on the Activity 
    Intent frec = new Intent(this, FrecView.class); 
    frec.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(frec); 
} 

ma ho ActionBar su tutte le mie attività in modo ogni volta che ogni attività è iniziata Si chiama sempre così devo mettere quel codice per ogni attività. Che cosa sta succedendo? Come posso evitare che ciò accada?

risposta

4

sto usando ActionBar briciolo un menu a discesa e onNavigationItemSelected() viene chiamato non appena attività viene creata

Questo non è stato progettato per essere un "menu", non più di quanto le schede sono progettate per essere un menù". La navigazione elenco è progettata per consentire all'utente di indicare alcuni contenuti per l'attività corrente, in genere sostituendo un frammento. Gli elementi di azione (ad es. I pulsanti della barra degli strumenti, l'area di spillover di azione) servono per navigare tra le attività.

Il primo elemento del menu a discesa è Casa la stessa azione di quando si preme l'icona dell'applicazione con Android.R.id.home così quando l'applicazione si avvia chiama sé stessa.

Quindi, eliminare quello dal "menu". L'utente può premere l'icona dell'app a sinistra per navigare verso casa.

+0

Ma se non lo metti a casa, chiamerà una delle mie Attività, tu dici che non è progettato per le attività di chiamata, quindi dovrei mettere tutto sulle icone di ActionBar? – Andres

+0

@Andres: "Ma se non li metti a casa, chiamerà una delle mie attività" - no, * tu * chiamerai "una delle [tue] attività". Un 'Spinner' ha sempre una selezione, se si sceglie o la prima voce per impostazione predefinita. Se scegli di iniziare un'attività in quella prima selezione, è colpa tua, perché sei stato tu a scrivere quel codice. – CommonsWare

+0

"è colpa tua" ... Forse non è destinato a essere un menu, ma sembra e si sente esattamente come uno. C'è un prezzo ragionevole per questo errore. Inoltre, diverse risorse tra cui SO suggeriscono questo approccio in modo errato: http://stackoverflow.com/questions/13958912/how-to-implement-a-drop-down-navigation-action-bar-in-android-after-youve-added – Alex

5

Come indicato da Mark, non è progettato per essere un menu.

Tuttavia, qui è un approccio veloce e sporco di ignorare la prima chiamata:

dichiarare questo campo classe:

//mNaviFirstHit should be initialized to true 
private boolean mNaviFirstHit = true; 

E nel onNavigationItemSelected:

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    if (mNaviFirstHit) { 
     mNaviFirstHit = false; 
     return true; 
    } 
    // DO WHAT YOU WOULD NORMALLY DO 
} 
+0

booleano privato mNaviFirstHit = falso; Non 0. – Radu

+0

SOLUZIONE CORRETTA: (Ho modificato anche il contenuto) mNaviFirstHit deve essere inizializzato su true non 0 non falso; –

0

Prima di tutto grazie a @CommonsWare per averci ricordato che è un'alternativa alle schede, quindi il codice dovrebbe essere progettato con quella prospettiva. Anche se non è così semplice come sembra, tuttavia possiamo lavorare lì.

Questo può essere evitato usando anche una bandiera. Ma, comunque, suggerisco l'approccio che ho preso per risolvere questo problema.

Assicurati solo che venga chiamato una volta. Oltre a ciò, ne fanno una classe interiore che anonima. Ciò impedirà che venga chiamato ogni volta che viene eseguita questa parte di codice. codice qui sotto:

if(localOnNavigationListener != null) 
    localOnNavigationListener = new LocalOnNavigationListener(); 

class LocalOnNavigationListener implements OnNavigationListener{ 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    // do something 
    return true; 
    } 

} 

e vedo uno strano evento qui, se mi fanno una classe interna che non chiama onNavigationItemSelected(), se facciamo una classe anonima, che scatterà onNavigationItemSelected metodo. Se qualcuno può far luce su questo, sarà utile.

3

È possibile forzare l'opzione predefinita corretta nel "menu" con il seguente:

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(indexOfCurrentActivityInTheMenu); 

Counter-intuitivamente questo deve essere fatto dopo l'impostazione del callback (che a mio parere avrebbe dato la richiamata la possibilità di fuoco con indice di navigazione 0). Ad esempio, la mia app ha due attività ListView e PageView e mi piace il mio menu di navigazione ordinato in ordine alfabetico, ma l'attività di avvio predefinita è PageView. Così ho il seguente in del PageView onCreate():

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(1); 

e di ListView onCreate():

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(0); 

Poi, non importa quante volte io chiamo startActivity (OtherView), sarà sempre impostato il menu di navigazione correttamente.

Problemi correlati