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