Problemy z tylnym stosem fragmentu Androida

Mam ogromny problem ze sposobem, w jaki wydaje się działać backstack fragmentu androida i byłbym bardzo wdzięczny za każdą oferowaną pomoc.

Wyobraź sobie, że masz 3 fragmenty

[1] [2] [3]

Chcę, aby użytkownik mógł nawigować[1] > [2] > [3] ale w drodze powrotnej (naciśnięcie przycisku wstecz)[3] > [1].

Jak sobie wyobrażałem, można to osiągnąć, nie dzwoniącaddToBackStack(..) podczas tworzenia transakcji, która przynosi fragment[2] do właściciela fragmentu zdefiniowanego w XML.

Rzeczywistość tego wydaje się taka, że ​​jeśli nie chcę[2] pojawia się ponownie, gdy użytkownik naciśnie przycisk Wstecz[3], Nie mogę zadzwonićaddToBackStack w transakcji, która pokazuje fragment[3]. Wydaje się to całkowicie sprzeczne z intuicją (być może pochodzące ze świata iOS).

W każdym razie, jeśli zrobię to w ten sposób, kiedy odejdę[1] > [2] i wciskaj przycisk, by wrócić[1] zgodnie z oczekiwaniami.

Jeśli pójdę[1] > [2] > [3] a następnie wcisnąć z powrotem, wracam do[1] (zgodnie z oczekiwaniami). Teraz dziwne zachowanie dzieje się, gdy próbuję skoczyć[2] znowu od[1]. Po pierwsze[3] jest krótko wyświetlany wcześniej[2] pojawia się na widoku. Jeśli wrócę w tym momencie[3] jest wyświetlany, a jeśli ponownie nacisnę przycisk, aplikacja zostanie zamknięta.

Czy ktoś może mi pomóc zrozumieć, co tu się dzieje?


A oto plik xml układu dla mojej głównej aktywności:

<?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"

        />



Aktualizacja To jest kod, którego używam do budowania przez heirarchię nawigacyjną

    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]

Wielkie dzięki

questionAnswers(8)

yourAnswerToTheQuestion