2012-11-01 7 views
8

Sto avendo due frammenti Frag A e Frag B che sono resi usando view pager. Se l'utente ha strisciato da A a B, quindi preme il pulsante indietro (quando è in B), l'utente deve passare ad A invece di uscire dal cercapersone. Come possiamo raggiungere questo risultato ?Come gestire il pulsante Indietro usando view pager?

L'aggiunta di transazioni su backstack non sembra essere d'aiuto.

Grazie

risposta

20

Devi eseguire l'override del metodo onKeyDown() nel Activity.

Questo catturerà l'evento di stampa del pulsante "indietro" e invierà l'utente al primo elemento nel ViewPager.

C'è anche ViewPager#getCurrentItem() che può essere utilizzato per tornare indietro solo se l'utente ha fatto scorrere. Un'implementazione come questo:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) { 
     myViewPager.setCurrentItem(0, true); 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 

avrebbe mandato l'utente torna alla pagina precedente solo se l'utente è alla pagina seguente. Altrimenti, registrerà normalmente il "ritorno" e l'utente uscirà come previsto.

Si consiglia il caso in cui l'utente ritorna alla pagina precedente (presupponendo che siano presenti più di due pagine). In tal caso, si desidera implementare lo ViewPager.OnPageChangeListener() e salvare la posizione ogni volta che viene chiamato onPageSelected(int position). Se li implementi in uno stack, puoi saltarli fuori ogni volta che l'utente preme "indietro". Una volta che lo stack è vuoto, esci dall'app.

EDIT

Come indicato correttamente nei commenti di Jade Byfield, un modo un po 'più facile fare questo sarebbe quella di utilizzare onBackPressed() in attività. Funzionerà solo con livelli API 5+.

@Override 
public void onBackPressed() { 
    if(i_dont_want_to_leave) { 
    myViewPager.setCurrentItem(0, true); 
    } else { 
    super.onBackPressed(); // This will pop the Activity from the stack. 
    } 
} 
+0

Potrebbe anche eseguire l'override suBackPressed? O è solo per le API precedenti? –

+0

L'uso di onKeyDown() funziona su ogni livello dell'API della piattaforma 1+. Inoltre, a meno che non lo stia usando sempre, onBackPressed non impedirà che l'attività venga spuntata dallo stack. Se ritorni 'true' in' onKeyDown() ', allora questa sarà l'unica cosa che accadrà e l'evento si fermerà a cascata. – DeeV

+0

Attendi. Ho appena avuto una discarica cerebrale. Sì. Può usare onBackPressed() se vuole targetizzare API 5+. Basta non chiamare 'super.onBackPressed() 'a meno che tu non sia assolutamente sicuro di voler uscire. – DeeV

0

Penso che un approccio migliore sarebbe delegare la gestione della chiave posteriore ai rispettivi frammenti. Ho usato un CustomFragment che supporta un metodo per gestire la chiave posteriore. Tutti i frammenti si estenderanno da questo CustomFragment.

public abstract class BackKeyHandlingFragment extends Fragment { 
    public abstract boolean handleBackKey(); 
} 

L'attività può delegare l'elaborazione backKey al frammento corrente. I frammenti possono eseguire le azioni richieste nella rispettiva implementazione del metodo handleBackKey. Il metodo può restituire true per indicare all'attività di non elaborare la chiave posteriore. Per procedere con l'azione del tasto Indietro di default a livello di attività, il metodo può restituire false.

public void onBackPressed() { 
    BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem()); 
    // Fragment should return boolean according to app requirements after processing back key 
    if (!fragment.handleBackKey()) { 
     super.onBackPressed(); 
    } 
} 
1

Nella pagina Documenti Android

https://developer.android.com/training/animation/screen-slide.html#viewpager

ho trovato un esempio di movimentazione ViewPager scorrevole e c'è un metodo

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
    super.onBackPressed(); 
    } 
    else { 
    mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
} 

Questo seleziona la pagina precedente o esce l'attività attivo .

Problemi correlati