Eu tenho um problema enorme com o modo como o backstack do fragmento android parece funcionar e ficaria muito grato por qualquer ajuda oferecida.
Imagine que você tem 3 fragmentos
[1] [2] [3]
Quero que o usuário possa navegar, [1] > [2] > [3]
mas no caminho de volta (pressionando o botão Voltar) [3] > [1]
.
Como eu imaginava, isso seria realizado se não fosse chamada addToBackStack(..)
ao criar a transação que traz fragmento [2]
para o detentor de fragmento definido em XML.
A realidade disso parece que, se eu não quiser [2]
aparecer novamente quando o usuário pressionar o botão Voltar [3]
, não devo chamar addToBackStack
a transação que mostra o fragmento [3]
. Isso parece completamente contra-intuitivo (talvez proveniente do mundo iOS).
De qualquer forma, se eu fizer dessa maneira, quando eu for [1] > [2]
e pressionar, chego de volta [1]
como esperado.
Se eu for [1] > [2] > [3]
e depois pressionar, pulo de volta para [1]
(como esperado). Agora o comportamento estranho acontece quando tento pular de [2]
novo para [1]
. Antes de tudo, [3]
é exibido brevemente antes de aparecer [2]
. Se eu pressionar novamente neste momento, [3]
será exibido e se eu pressionar novamente, o aplicativo será encerrado.
Alguém pode me ajudar a entender o que está acontecendo aqui?
E aqui está o arquivo xml de layout para minha atividade principal:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/headerFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
class="com.fragment_test.FragmentControls" >
<!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
android:id="@+id/detailFragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
/>
Atualizar Este é o código que estou usando para criar pela hierarquia de navegação
Fragment frag;
FragmentTransaction transaction;
//Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
frag = new Fragment1();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2]
frag = new Fragment3();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//END OF SETUP CODE-------------------------
//NOW:
//Press back once and then issue the following code:
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Now press back again and you end up at fragment [3] not [1]
Muito Obrigado