Qual è il significato di addToBackStack con parametro null?


94

Ho un codice cliente. Esiste una sola attività per tutti i frammenti, ovvero la singola attività è la gestione di tutti i frammenti.

Questa attività contiene il codice seguente per qualsiasi frammento alla fine del metodo di quel frammento:

Ad esempio - frammento MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Così,

1) Qual è il significato di addToBackStack(null)seguito da a commit()?

2) Perché è necessario passare un parametro null a addToBackStack?

3) Come ottenere quel frammento dopo essere stato aggiunto in questo modo?

Sembra che questo codice sia inutile poiché ho eseguito il codice senza l'ultima riga .addToBackStack(null).commit()ed è stato eseguito senza problemi.


developer.android.com/reference/android/app/… in alcuni casi è necessario chiamare quel metodo.
Lucifero


3
È possibile passare il nome del frammento come parametro a addToBackStack (nome) anziché a Null. Se si passa Null, non sarà possibile utilizzare il metodo FragmentManager.popBackStackImmediate (String name, int flags); o popBackStack (nome stringa, flag int); perché il nome era Null. Quindi i metodi popBackstack non funzioneranno. Ti suggerisco di passare il nome del frammento come parametri invece di passare null.
luckylukein

Risposte:


112

Qual è il significato di addToBackStack (null) seguito da commit ()?

Citando documenti:

Chiamando addToBackStack (), la transazione di sostituzione viene salvata nello stack posteriore in modo che l'utente possa invertire la transazione e ripristinare il frammento precedente premendo il pulsante Indietro.

Se aggiungi più modifiche alla transazione (come un altro add () o remove ()) e chiami addToBackStack (), tutte le modifiche applicate prima di chiamare commit () vengono aggiunte allo stack indietro come una singola transazione e il pulsante Indietro li invertirà tutti insieme.

L'ordine in cui aggiungi le modifiche a una FragmentTransaction non ha importanza, tranne:

Devi chiamare per commit()ultimo. Se stai aggiungendo più frammenti allo stesso contenitore, l'ordine in cui li aggiungi determina l'ordine in cui compaiono nella gerarchia di visualizzazione.

Quindi devi impegnarti alla fine.

Perché è necessario passare un parametro null a addToBackStack?

Non è necessario che sia nullo, può essere una stringa. Se non vuoi, passa semplicemente null.

public abstract FragmentTransaction addToBackStack (nome stringa)

Aggiunto nel livello API 11 Aggiungi questa transazione allo stack indietro. Ciò significa che la transazione verrà ricordata dopo il commit e annullerà la sua operazione quando verrà successivamente rimossa dallo stack.

Parametri nome Un nome facoltativo per questo stato dello stack indietro o null.

Riguardo a:

Sembra che questo codice sia inutile poiché ho eseguito il codice senza l'ultima riga .addToBackStack (null) .commit () e ha funzionato senza problemi

Se vuoi passare al frammento precedente, aggiungilo al backstack. Quindi dipende da se vuoi aggiungere il frammento al backstack.

Come ottenere quel frammento dopo essere stato aggiunto in questo modo?

Hai già l'istanza del frammento firstFragment. Quindi non so cosa intendi per ottenere il frammento più tardi.

Maggiori informazioni @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


Puoi anche aggiungere questo alla tua risposta dal documento API: Aggiungi questa transazione allo stack precedente. Ciò significa che la transazione verrà ricordata dopo il commit e annullerà la sua operazione quando verrà successivamente rimossa dallo stack. Nome parametri Un nome facoltativo per questo stato dello stack posteriore o null.
Dyrborg

Quindi, come ho capito, l'intero scopo dell'aggiunta al backstack è eseguire la navigazione come facciamo con il pulsante Indietro per andare al frammento precedente?
Mio Dio

ok quindi se stai passando un parametro a addToBackStack, perché dobbiamo farlo getFragmentManager().popBackStackImmediate()se il pulsante Indietro può farlo da solo con / senza passaggio del parametro? Vedi la risposta di - stackoverflow.com/questions/21156153/…
My God

@VedPrakash non è necessario che tu abbia. Inoltre questa è una domanda e una risposta completamente diverse. Puoi scoprirlo facilmente aggiungendo due frammenti alla pila posteriore e premendo il pulsante Indietro
Raghunandan

@VedPrakash ha letto la gestione dei frammenti @ developer.android.com/guide/components/fragments.html
Raghunandan

17

La tagstringa in addToBackStack(String name)fornisce un modo per individuare lo stack posteriore per il successivo pop direttamente in quella posizione. Voleva essere utilizzato nel metodo popToBackStack(String name, int flags):

Pop l'ultima transizione di frammento dallo stack di frammento indietro del gestore. Questa funzione è asincrona: accoda la richiesta da visualizzare, ma l'azione non verrà eseguita finché l'applicazione non torna al suo ciclo di eventi.

nome: se non nullo, questo è il nome di uno stato precedente precedente da cercare; se trovato, verranno visualizzati tutti gli stati fino a quello stato. Il flag POP_BACK_STACK_INCLUSIVE può essere utilizzato per controllare se lo stato denominato stesso viene estratto. Se null, viene visualizzato solo lo stato superiore.

flag: 0 o POP_BACK_STACK_INCLUSIVE.

In altre parole, aprirà il tuo back stack finché non trova il frammento che è stato aggiunto da namein addToBackStack(String name).

Ad esempio, se esegui una serie di aggiunte o sostituzioni al fragment manager assegnando i nomi "frag1", "frag2", "frag3", "frag4" e successivamente vuoi tornare direttamente al frammento 2 aggiunto con addToBackStack (" frag2 "), chiami popToBackStack("frag2", 0).

Così,

  • Usa .addToBackStack("fragName"): se vuoi in seguito popToBackStack(String name, int flags)estrarre più di uno stack.

  • Usa .addToBackStack(null): se in seguito non vuoi estrarre più di uno stack indietro, ma vuoi comunque farne uno alla volta. Fallo anche se non chiamerai esplicitamente popToBackStack () ma lascerai invece che l'implementazione predefinita di back press gestisca lo stack di back.

  • Usa .disallowAddToBackStack(): se non vuoi premere il tasto indietro o chiamare popBackStack () esplicitamente. Si assicurerà che nessuna parte del codice utilizzi .addToBackStack ().


1

Le tue risposte sono deprecate. Se non desideri aggiungere frammenti allo stack di backup, dovresti utilizzare lo snippet di codice seguente:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Di seguito hai un simpatico esempio di come usarlo:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
Deprecato dove? Non vedo nulla nella documentazione o nell'origine FragmentTransaction.
Rup

3
Attenzione, se tu disallowAddToBackStack, quindi qualsiasi chiamata futura a addToBackStack genererà IllegalStateException. Se addToBackStack è già stato chiamato, questo metodo genererà IllegalStateException.
Kathir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.