Qual é o significado de addToBackStack com parâmetro null?

93

Eu tenho um código de cliente. Existe apenas uma atividade para todos os fragmentos, ou seja, a única atividade é gerenciar todos os fragmentos.

Esta atividade contém o seguinte código para qualquer fragmento no final do método desse fragmento-

Por exemplo - fragmento MoreFragment:

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

Assim,

1) Qual é o significado de addToBackStack(null)seguido por a commit()?

2) Por que você precisa passar um parâmetro nulo para addToBackStack?

3) Como obter aquele fragmento após ser adicionado desta forma?

Parece que este código é inútil, pois executei o código sem a última linha .addToBackStack(null).commit()e ele foi executado sem problemas.

Meu Deus
fonte
developer.android.com/reference/android/app/… em alguns casos, você deve chamar esse método.
Lúcifer de
3
Você pode passar o nome do fragmento como o parâmetro para addToBackStack (nome) em vez de Nulo. Se você passar Null, não será possível usar o método FragmentManager.popBackStackImmediate (String name, int flags); ou popBackStack (nome da string, sinalizadores internos); porque o nome era Nulo. Portanto, os métodos popBackstack não funcionarão. Eu sugiro que você passe o nome do Fragment como os parâmetros em vez de passar null.
luckyylukein

Respostas:

110

Qual é o significado de addToBackStack (null) seguido por um commit ()?

Citando documentos:

Ao chamar addToBackStack (), a transação de substituição é salva na pilha de retorno para que o usuário possa reverter a transação e trazer de volta o fragmento anterior pressionando o botão Voltar.

Se você adicionar várias alterações à transação (como outro add () ou remove ()) e chamar addToBackStack (), todas as alterações aplicadas antes de chamar commit () serão adicionadas à pilha de retorno como uma única transação e o botão Voltar irá revertê-los todos juntos.

A ordem em que você adiciona alterações a uma FragmentTransaction não importa, exceto:

Você deve ligar por commit()último. Se você estiver adicionando vários fragmentos ao mesmo contêiner, a ordem em que você os adiciona determina a ordem em que aparecem na hierarquia de visualizações.

Então você tem que se comprometer no final.

Por que você precisa passar um parâmetro nulo para addToBackStack?

Não precisa ser nulo, pode ser uma string. Se não quiser, basta passar null.

public abstract FragmentTransaction addToBackStack (nome da string)

Adicionado no nível 11 da API. Adicione esta transação à pilha de retorno. Isso significa que a transação será lembrada após ser confirmada e reverterá sua operação quando mais tarde for retirada da pilha.

Parâmetros name Um nome opcional para este estado de back stack ou nulo.

Relativo:

Parece que este código é inútil porque eu o executei sem a última linha .addToBackStack (null) .commit () e ele foi executado sem problemas

Se você deseja navegar para o fragmento anterior, adicione-o ao backstack. Portanto, depende se você deseja adicionar o fragmento à pilha de retorno.

Como obter esse fragmento após ser adicionado assim?

Você já tem a instância do fragmento firstFragment. Portanto, não sei o que você quer dizer com obter o fragmento mais tarde.

Mais Informações @

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

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

Raghunandan
fonte
Você também pode adicionar isso à sua resposta no documento da API: Adicione esta transação à pilha de retorno. Isso significa que a transação será lembrada após ser confirmada e reverterá sua operação quando mais tarde for retirada da pilha. Parâmetros name Um nome opcional para este estado de back stack ou nulo.
Dyrborg,
Então, como eu entendi, todo o propósito de adicionar ao backstack é realizar a navegação como fazemos com o botão Voltar para ir ao fragmento anterior?
Meu Deus de
ok então se você está passando um parâmetro para addToBackStack então por que precisamos fazer getFragmentManager().popBackStackImmediate()se o botão Voltar pode fazer isso sozinho com / sem passagem de parâmetro? Veja a resposta de - stackoverflow.com/questions/21156153/…
Meu Deus de
@VedPrakash você não precisa. Além disso, essa é uma pergunta e uma resposta totalmente diferentes. Você pode descobrir a si mesmo facilmente adicionando dois fragmentos à pilha de volta e pressionando o botão Voltar
Raghunandan,
@VedPrakash leu gerenciamento de fragmentos @ developer.android.com/guide/components/fragments.html
Raghunandan
17

A tagstring em addToBackStack(String name)fornece uma maneira de localizar a pilha de retorno para depois ir diretamente para aquele local. Deve ser usado no método popToBackStack(String name, int flags):

Abra a última transição de fragmento da pilha de retorno de fragmentos do gerente. Esta função é assíncrona - ela enfileira a solicitação para pop, mas a ação não será executada até que o aplicativo retorne ao seu loop de eventos.

nome: se não nulo, este é o nome de um estado anterior anterior a ser procurado; se encontrado, todos os estados até aquele estado serão exibidos. O sinalizador POP_BACK_STACK_INCLUSIVE pode ser usado para controlar se o próprio estado nomeado é exibido. Se nulo, apenas o estado superior é exibido.

sinalizadores: 0 ou POP_BACK_STACK_INCLUSIVE.

Em outras palavras, ele irá estourar sua pilha de volta até encontrar o fragmento que foi adicionado pelo nameem addToBackStack(String name).

Por exemplo, se você fizer uma série de adições ou substituições ao gerenciador de fragmentos dando os nomes "frag1", "frag2", "frag3", "frag4" e posteriormente quiser voltar diretamente para o fragmento 2 adicionado com addToBackStack (" frag2 "), você liga popToBackStack("frag2", 0).

Assim,

  • Use .addToBackStack("fragName"): se você quiser popToBackStack(String name, int flags)pop mais de uma pilha posterior.

  • Uso .addToBackStack(null): Se você não quiser abrir mais de uma pilha posterior, mas ainda quiser abrir uma de cada vez. Faça isso mesmo se você não chamar explicitamente popToBackStack (), mas, em vez disso, permitirá que a implementação padrão do pressionamento de volta trate da pilha de retorno.

  • Uso .disallowAddToBackStack(): Se você não quiser o back pressione ou chame popBackStack () explicitamente. Isso garantirá que nenhuma parte do código esteja usando .addToBackStack ().

Allan Veloso
fonte
1

Suas respostas foram descontinuadas. Se você não quiser adicionar fragmentos para empilhar, você deve usar o snippet de código abaixo:

    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();
    }

Abaixo você tem um exemplo bonito de como usá-lo:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
fonte
6
Obsoleto onde? Não vejo nada na documentação ou na fonte FragmentTransaction.
Rup de
3
Cuidado, disallowAddToBackStackentão, Quaisquer chamadas futuras para addToBackStack lançarão IllegalStateException. Se addToBackStack já tiver sido chamado, este método lançará IllegalStateException.
Kathir