Portei meu aplicativo Android para o favo de mel e fiz um grande refator para usar fragmentos. Na minha versão anterior, quando eu pressionava o botão Início, fazia um ACTIVITY_CLEAR_TOP
para redefinir a pilha traseira.
Agora, meu aplicativo é apenas uma única atividade com vários fragmentos; portanto, quando pressiono o botão Início, substituo um dos fragmentos dentro dele. Como posso limpar minha pilha traseira sem precisar usar startActivity
a ACTIVITY_CLEAR_TOP
bandeira?
android
android-fragments
biquillo
fonte
fonte
Respostas:
Eu postei algo parecido aqui
Da resposta de Joachim, de Dianne Hackborn:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Acabei usando:
Mas poderia igualmente ter usado algo como:
O que exibirá todos os estados até o nomeado. Você pode substituir o fragmento pelo que deseja
fonte
Para responder ao comentário de @ Warpzit e facilitar a localização de outras pessoas.
Usar:
fonte
Com todo o respeito a todas as partes envolvidas; Estou muito surpreso ao ver quantos de vocês conseguiram limpar todo o fragmento da pilha traseira com um simples
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
De acordo com a documentação do Android (referente ao
name
argumento - o "nulo" nas propostas de trabalho reivindicadas).Agora, percebo que não tenho conhecimento de suas implementações específicas (como quantas entradas você tem na pilha traseira no momento especificado), mas eu apostaria todo meu dinheiro na resposta aceita ao esperar uma resposta bem definida. comportamento em uma ampla variedade de dispositivos e fornecedores:
(para referência, algo junto com isso)
fonte
Funciona para mim e de maneira fácil sem usar loop:
fonte
A resposta aceita não foi suficiente para mim. Eu tive que usar:
fonte
popBackStackImmediate()
realiza a transação de forma síncrona, o que é geralmente desaconselhável.Backstack claro sem loops
Onde name é o parâmetro addToBackStack ()
fonte
Eu só queria adicionar: -
Sair do backstack usando as seguintes
trata-se de remover os fragmentos da transação, de maneira alguma ele removerá o fragmento da tela. Então, idealmente, pode não ser visível para você, mas pode haver dois ou três fragmentos empilhados um sobre o outro e, ao pressionar a tecla Voltar, a interface do usuário pode parecer desordenada, empilhada.
Apenas tomando um exemplo simples: -
Suponha que você tenha um fragmentoA que carrega o Fragmnet B usando fragmentmanager.replace () e, em seguida, adicionamosToToBackStack, para salvar esta transação. Então o fluxo é: -
PASSO 1 -> Fragmento A-> Fragmento B (passamos para o Fragmento B, mas o Fragmento A está em segundo plano, não visível).
Agora, você trabalha no fragmento B e pressiona o botão Salvar - que após salvar deve voltar ao fragmento A.
PASSO 2-> Ao salvar o FragmentB, voltamos ao FragmentA.
PASSO 3 -> Um erro tão comum seria ... no fragmento B, faremos o fragmento Manager.replace () fragmentB pelo fragmentoA.
Mas o que realmente está acontecendo, estamos carregando o Fragmento A novamente, substituindo o FragmentoB. Portanto, agora existem dois FragmentosA (um do PASSO-1 e um deste PASSO-3).
Duas instâncias de FragmentsA são empilhadas umas sobre as outras, que podem não estar visíveis, mas estão lá.
Portanto, mesmo se limparmos o backstack pelos métodos acima, a transação será limpa, mas não os fragmentos reais. Então, idealmente, nesse caso particular, ao pressionar o botão Salvar, você simplesmente precisa voltar ao fragmento A, executando simplesmente fm.popBackStack () ou fm.popBackImmediate () .
Portanto, corrija o Passo 3 -> fm.popBackStack () para o fragmento A, que já está na memória.
fonte
Lendo a documentação e estudando qual é o ID do fragmento, ele parece ser simplesmente o índice da pilha, então isso funciona:
Zero (
0
) é a parte inferior da pilha; portanto, aparecer nela limpa a pilha.CAVEAT: Embora o acima funcione no meu programa, hesito um pouco porque a documentação do FragmentManager nunca afirma que o id é o índice da pilha. Faz sentido que seria, e todos os meus logs de depuração revelam que é, mas talvez em alguma circunstância especial não seria? Alguém pode confirmar isso de uma maneira ou de outra? Se for, o acima é a melhor solução. Caso contrário, esta é a alternativa:
fonte
fragmentManager..getBackStackEntryAt(0).getId()
vez de 0? Isso deve funcionar mesmo se os IDs de entrada do backstack forem diferentes em algum momento do índice da pilha.Uso
fonte
Oi ~ Encontrei uma solução muito melhor em: https://gist.github.com/ikew0ng/8297033
fonte
Eu consegui trabalhar desta maneira:
fonte
Está funcionando para mim, tente este:
fonte
A chamada para esse método seria muito interessante.
fonte
fonte