Estou usando o novo componente de arquitetura de navegação no Android e estou preso em limpar a pilha de navegação depois de mover para um novo fragmento.
Exemplo: estou no loginFragment e quero que este fragmento seja apagado da pilha quando navego para o fragmento inicial, para que o usuário não seja retornado ao loginFragment quando pressionar o botão Voltar.
Estou usando um NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) simples para navegar.
Código Atual:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
Tentei usar o NavOptions no navegador () , mas o botão Voltar ainda está me enviando de volta para o loginFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
android
android-fragments
android-architecture-components
android-architecture-navigation
Youssef El Behi
fonte
fonte
popBackStack
ou não adicionarLoginFragment
a backstack fornecernull
paraaddToBackStack(null);
e substituí-lo com o novoFragment
navigate()
método comonavigate(int resId, Bundle args, NavOptions navOptions)
e fornecer oNavOptions
que melhor se ajusta ao seu senárioRespostas:
Primeiro, adicione atributos
app:popUpTo='your_nav_graph_id'
eapp:popUpToInclusive="true"
à tag de ação.Em segundo lugar, navegue até o destino, usando a ação acima como parâmetro.
Veja a documentação para mais informações.
NOTA : Se você navegar usando o método
navigate(@IdRes int resId)
, não obterá o resultado desejado. Portanto, usei o métodonavigate(@NonNull NavDirections directions)
.fonte
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
Acho que sua pergunta se refere especificamente a como usar Pop Behavior / Pop To / app: popUpTo (em xml)
Na documentação,
selecione um determinado destino antes de navegar. Isso exibe todos os destinos não correspondentes da pilha posterior até que esse destino seja encontrado.
Exemplo (aplicativo de caça de empregos simples)
meu gráfico start_screen_nav é assim:
se eu quiser navegar
EmployerMainFragment
e abrir todos, incluindostartScreenFragment
, o código será:se eu quiser navegar
EmployerMainFragment
e abrir todas as excluindostartScreenFragment
, o código será:se eu quiser navegar
EmployerMainFragment
e abrir,loginFragment
mas nãostartScreenFragment
, o código será:OU
fonte
No meu caso, eu precisei remover tudo na pilha traseira antes de abrir um novo fragmento, então usei este código
a primeira linha remove a pilha traseira até atingir o fragmento especificado, no meu caso, é o fragmento inicial, portanto, remove toda a pilha traseira completamente e, quando o usuário clica de volta em fragment_company, ele fecha o aplicativo.
fonte
fragment_apps
??NOTA: Limpar tarefa está obsoleta, a descrição oficial é
Resposta Antiga
Se você não quer passar por tudo isso fuzz no código, você pode simplesmente verificar
Clear Task
emLaunch Options
em propriedades da ação.Editar: a partir do Android Studio 3.2 Beta 5, Clear Task não está mais visível na janela Launch Options, mas você ainda pode usá-lo no código XML de navegação, na tag de ação , adicionando
fonte
Eu finalmente descobri isso graças a Como desativar o UP na navegação para algum fragmento com o novo componente de arquitetura de navegação?
Tive que especificar .setClearTask (true) como um NavOption.
fonte
navigate(int resId, Bundle args, NavOptions navOptions)
eNavOptions
val navOptions = NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build()
findNavController().navigate(R.id.my_next_frag, null, navOptions)
R.id.my_next_frag
pode ser como login ou tela inicial); Também se você quiser popBack apenas um, você pode usar:NavHostFragment.findNavController(this).popBackStack()
.Aqui está como estou fazendo isso.
fonte
false
?inclusive boolean: true to also pop the given destination from the back stack
Então, eu defino o inclusivo como falso porque não quero retirar o fragmento atual da pilha.fonte
Você pode substituir o pressionamento de volta da atividade de base desta forma:
fonte
Nota: Isso pode não se relacionar com a questão real.
Essa abordagem será útil se uma única instância de um fragmento for necessária para manter na Navegação .
Aqui,
navOptions
está DSL e precisa ser importado. No momento desta resposta, estou usando as seguintes versões do Gradle da IU de navegação .fonte
Lutei por um tempo para evitar que o botão Voltar retornasse ao meu fragmento de início, que no meu caso era uma mensagem de introdução que deveria aparecer apenas uma vez.
A solução fácil foi criar uma ação global apontando para o destino em que o usuário deveria permanecer. Você tem que definir
app:popUpTo="..."
corretamente - defina-o para o destino que você deseja que seja retirado. No meu caso, foi minha mensagem de introdução. Também definidoapp:popUpToInclusive="true"
fonte
Posso explicar isso por meio de um pequeno exemplo. Eu tenho dois fragmentos de lista de funcionários e excluo funcionários. Em excluir funcionário, tenho dois eventos de clique para cancelar e excluir. Se eu clicar em cancelar, simplesmente volto para a tela da lista de funcionários e, se eu clicar em excluir, quero limpar todas as mochilas anteriores e ir para a tela da lista de funcionários.
Para ir para a tela anterior:
Para limpar todo o backstack anterior e ir para a nova tela:
Para obter mais referências: Exemplo de navegação Jetpack
fonte
Você pode fazer tão simples quanto:
Se quiser verificar a contagem, faça o seguinte:
fonte