Problemas com a pilha de fragmentos do Android

Eu tenho um problema enorme com a forma como o backstack do fragmento do Android parece funcionar e ficaria muito grato por qualquer ajuda que é oferecida.

Imagine que você tem 3 fragmentos

[1] [2] [3]

Eu quero que o usuário possa navegar[1] > [2] > [3] mas no caminho de volta (pressionando o botão Voltar)[3] > [1].

Como eu teria imaginado, isso seria realizado sem chamaraddToBackStack(..) ao criar a transação que traz fragmento[2] no detentor do fragmento definido em XML.

A realidade disso parece que se eu não quiser[2] para aparecer novamente quando o usuário pressiona o botão Voltar[3], Eu não devo ligaraddToBackStack na transação que mostra fragmento[3]. Isso parece completamente contra-intuitivo (talvez vindo do mundo do iOS).

Enfim, se eu fizer assim, quando eu for[1] > [2] e pressione de volta eu chego de volta ao[1] como esperado.

Se eu for[1] > [2] > [3] e, em seguida, pressione de volta eu salto de volta para[1] (como esperado). Agora o comportamento estranho acontece quando eu tento pular para[2] novamente de[1]. Em primeiro lugar[3] é brevemente exibido antes[2] entra em vista. Se eu pressionar de volta neste ponto[3] é exibido e, se eu pressionar novamente, o aplicativo sai.

Alguém pode me ajudar a entender o que está acontecendo aqui?


E aqui está o layout do arquivo xml 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&nbsp;Este é o código que estou usando para construir pela hierarquia nav

    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