1) fragmentTransaction.addToBackStack(str);
Descrição - adicione esta transação à pilha traseira. Isso significa que a transação será lembrada após ser confirmada e reverterá sua operação quando mais tarde sair da pilha.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Descrição - Substitua um fragmento existente que foi adicionado a um contêiner. Isso é essencialmente o mesmo que chamar remove (Fragment) para todos os fragmentos adicionados atualmente que foram adicionados com o mesmo containerViewId e, em seguida, add (int, Fragment, String) com os mesmos argumentos fornecidos aqui.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Descrição - adicione um fragmento ao estado da atividade. Opcionalmente, esse fragmento também pode ter sua visualização (se Fragment.onCreateView retornar não nulo) em uma visualização de contêiner da atividade.
O que significa substituir um fragmento já existente e adicionar um fragmento ao estado da atividade e adicionar uma atividade à pilha traseira?
Há uma pilha na qual todas as atividades no estado de execução são mantidas. Fragmentos pertencem à atividade. Então você pode adicioná-los para incorporá-los em uma atividade.
Você pode combinar vários fragmentos em uma única atividade para criar uma interface do usuário com vários painéis e reutilizar um fragmento em várias atividades. Isso é essencialmente útil quando você define seu contêiner de fragmentos em diferentes layouts. Você só precisa substituir por qualquer outro fragmento em qualquer layout.
Ao navegar para o layout atual, você tem o ID desse contêiner para substituí-lo pelo fragmento desejado.
Você também pode voltar ao fragmento anterior no backStack com o popBackStack()
método Para isso, você precisa adicionar esse fragmento na pilha usando addToBackStack()
e depois commit()
para refletir. Isso está na ordem inversa com a corrente no topo.
findFragmentByTag esta busca pela tag adicionada pelo método add / replace ou pelo método addToBackStack?
Se depende de como você adicionou a tag. Em seguida, ele apenas encontra um fragmento por sua tag que você definiu antes, quando inflado a partir do XML ou como fornecido quando adicionado a uma transação.
Referências: FragmentTransaction
Mais uma diferença importante entre
add
ereplace
é esta:replace
remove o fragmento existente e adiciona um novo fragmento. Isso significa que, quando você pressionar o botão Voltar, o fragmento que foi substituído será criado com aonCreateView
invocação. Considerando queadd
retém os fragmentos existentes e adiciona um novo fragmento, o que significa que o fragmento existente estará ativo e eles não estarão no estado 'pausado', portanto, quando um botão voltar é pressionado,onCreateView
o fragmento existente não é chamado (o fragmento que existia antes do fragmento novo ser adicionado).Em termos de eventos do ciclo de vida de fragmento
onPause
,onResume
,onCreateView
e outros eventos de ciclo de vida vai ser invocado em caso dereplace
mas eles não vão ser invocada em caso deadd
.Edit : Deve-se ter cuidado se ela estiver usando algum tipo de biblioteca de barramento de eventos como o Eventbus da Greenrobot e reutilizar o mesmo fragmento para empilhá-lo em cima de outro via
add
. Nesse cenário, mesmo que você siga as práticas recomendadas e registreonResume
e cancele o registro doonPause
barramento de eventos, o barramento de eventos ainda estará ativo em cada instância do fragmento adicionado, pois oadd
fragmento não chamará nenhum desses métodos de ciclo de vida do fragmento. Como resultado, o ouvinte do barramento de eventos em cada instância ativa do fragmento processaria o mesmo evento, que pode não ser o que você deseja.fonte
Exemplo de uma atividade tem 2 fragmentos e usamos
FragmentManager
para substituir / adicionar comaddToBackstack
cada fragmento a um layout na atividadeUse substituir
Go Fragment1
Go Fragment2
Fragmento Pop2
Fragmento Pop1
Use add
Go Fragment1
Go Fragment2
Fragmento Pop2
Fragmento Pop1
Projeto de exemplo
fonte
onPause()
deveria ter sido chamado antesonStop()
em toda ação pop ?Embora seja uma pergunta antiga já respondida, talvez os próximos exemplos possam complementar a resposta aceita e possam ser úteis para alguns novos programadores no Android como eu.
Opção 1 - "addToBackStack ()" nunca é usado
Caso 1A - adicionando, removendo e clicando no botão Voltar
Caso 1B - adicionando, substituindo e clicando no botão Voltar
Opção 2 - "addToBackStack ()" é sempre usado
Caso 2A - adicionando, removendo e clicando no botão Voltar
Caso 2B - adicionando, substituindo, removendo e clicando no botão Voltar
Opção 3 - "addToBackStack ()" nem sempre é usado (nos exemplos abaixo, sem / indica que não é usado)
Caso 3A - adicionando, removendo e clicando no botão Voltar
Caso 3B - adicionando, substituindo, removendo e clicando no botão Voltar
fonte
Diferença básica entre
add()
ereplace()
pode ser descrita como:add()
é usado simplesmente para adicionar um fragmento a algum elemento raiz.replace()
se comporta de maneira semelhante, mas a princípio remove os fragmentos anteriores e depois adiciona o próximo fragmento.Podemos ver a diferença exata quando usamos
addToBackStack()
junto comadd()
oureplace()
.Quando pressionamos o botão voltar depois, no caso de
add()
... onCreateView nunca é chamado, mas no caso dereplace()
, quando pressionamos o botão voltar ... oncreateView é chamado sempre.fonte
Quando adicionamos primeiro fragmento -> segundo fragmento usando o método add ()
Quando usamos add () no fragmento
Quando usamos replace () no fragmento
indo do primeiro fragmento para o segundo fragmento em Primeiro -> Segundo usando o método replace ()
No caso de Substituir primeiro fragmento, esse método é chamado extra (onPause, onStop, onDestroyView é chamado extra)
E / Keshav FirstFragment: onPause
E / Keshav FirstFragment: onStop
E / Keshav FirstFragment: onDestroyView
fonte
A função add e replace do FragmentManger pode ser descrita como 1. 1. add significa que ele adicionará o fragmento na pilha traseira do fragmento e será exibido em um determinado quadro que você está fornecendo como
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2.replace significa que você está substituindo o fragmento por outro fragmento no quadro especificado
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
O utilitário principal entre os dois é que, quando você estiver empilhando novamente, a substituição atualizará o fragmento, mas o add não atualizará o fragmento anterior.
fonte
É importante notar:
A diferença entre Replace e Replace with backstack é sempre que usamos apenas replace, então o fragmento é destruído (ondestroy () é chamado) e quando usamos replace with backstack, os fragmentos onDestroy () não são chamados (ou seja, quando o botão voltar é pressionado, o fragmento é chamado com seu onCreateView ())
fonte
Aqui está uma imagem que mostra a diferença entre
add()
ereplace()
Portanto, o
add()
método continua adicionando fragmentos sobre o fragmento anterior no FragmentContainer.Enquanto os
replace()
métodos limpam todo o fragmento anterior dos contêineres e o adicionam no FragmentContainer.O que é addToBackStack
addtoBackStack
O método pode ser usado com os métodos add () e substitua. Ele serve a um propósito diferente na Fragment API.Qual é o propósito?
A API de fragmentos, diferentemente da Activity API, não vem com a navegação no botão Voltar por padrão. Se você deseja voltar ao Fragmento anterior, usamos o método addToBackStack () no Fragmento. Vamos entender os dois
Caso 1:
Caso 2:
fonte