2013-05-15 7 views
11

Ho un probleam e non riesco a trovare una soluzione da nessuna parte.addToBackStack non funziona, chiude l'attività invece di scontrare i frammenti

La mia app non torna al frammento precedente quando premo il pulsante Indietro, invece si chiude l'attività.

Ho un'attività che visualizza 4 frammenti: [1], [2], [3], [4]. Posso passare tra i primi 3 frammenti con la barra delle azioni, non voglio aggiungerli allo stack posteriore.

Frammento [4] è una vista dettagliata di un elemento selezionato in frammento [3]. Quando torno indietro [4] voglio tornare al frammento [3], non chiudendo l'app.

Le transizioni sono fatti in questo modo dall'attività in cui sono collocati frammenti:

private void replaceFragment(Fragment fragment, boolean toBackStack){ 

    if(fragment != null){ 

     FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.container, fragment); 

     if(toBackStack) 
      fragmentTransaction.addToBackStack(null); 

     fragmentTransaction.commit(); 
    } 
} 

dove toBackStack è sempre false tranne quando la transizione è dallo [3] a [4].

Se si passa a BackStack true in ogni transizione, l'attività si chiude comunque.

risposta

17

Ho avuto lo stesso problema. Nello specifico, sto implementando un PreferenceFragment e voglio che il pulsante Indietro mi restituisca qualunque sia il frammento precedentemente caricato.

Sembra che il "stack back" è qualcosa che non viene attivato automaticamente con il pulsante indietro sistema. La mia soluzione era al pop manualmente la pila di ritorno dal onBackPressed di override:

@Override 
public void onBackPressed() 
{ 
    if (inSettings) 
    { 
     backFromSettingsFragment(); 
     return; 
    } 
    super.onBackPressed(); 
} 

Ogni volta che si dirige verso il mio frammento preferenze, ho impostato il inSettings booleano true nell'attività di mantenere quello stato. Ecco ciò che il mio backFromSettingsFragment metodo assomiglia:

private void backFromSettingsFragment() 
{ 
    inSettings = false; 
    getFragmentManager().popBackStack(); 
} 

Quindi, se siete in grado di tenere traccia dello stato di quando si è in Frammento [4] e intercettare il pulsante Indietro, si dovrebbe essere in grado di chiamare manualmente

getFragmentManager().popBackStack(); 

per tornare a Frammento [3].

Nota: si ricorda che è necessario aggiungere Frammento [3] per la pila avanti, non Frammento [4]. (A meno che [4] va a [5] ed è necessario tornare al [4] pure.)

+3

Quindi piuttosto che mantenere lo stato in attività potrebbe essere meglio farlo in onBackPressed() se (getFragmentManager() .getBackStackEntryCount()> 0) getFragmentManager(). popBackStack(); – toidiu

Problemi correlati