У мене виникає велика проблема з тим, як, здається, працює задник з фрагментами андроїда, і буду дуже вдячний за будь-яку допомогу, яку пропонують.
Уявіть, що у вас є 3 фрагменти
[1] [2] [3]
Я хочу, щоб користувач міг орієнтуватися, [1] > [2] > [3]
але на зворотному шляху (натискаючи кнопку назад) [3] > [1]
.
Як я міг би уявити, це буде досягнуто, не викликаючи addToBackStack(..)
при створенні транзакції, яка приносить фрагмент [2]
до власника фрагмента, визначеного в XML.
Реальність цього виглядає так, що якщо я не хочу [2]
з’являтися знову, коли користувач натискає кнопку назад [3]
, я не повинен дзвонити addToBackStack
в транзакції, що показує фрагмент [3]
. Це здається абсолютно протиінтуїтивним (можливо, походить із світу iOS).
У будь-якому випадку, якщо я це роблю таким чином, коли я йду [1] > [2]
і натискаю назад, я повертаюся назад, [1]
як очікувалося.
Якщо я іду, [1] > [2] > [3]
а потім натискаю назад, я стрибаю назад [1]
(як очікувалося). Зараз дивна поведінка трапляється, коли я намагаюся [2]
знову перестрибнути [1]
. Перш за все [3]
, коротко відображається, перш ніж [2]
потрапить у поле перегляду. Якщо я натискаю назад у цей момент [3]
, відображається, і якщо я натискаю ще раз, програма закриває.
Хтось може допомогти мені зрозуміти, що тут відбувається?
І ось основний xml-файл для моєї основної діяльності:
<?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"
/>
Оновити Це код, який я використовую для побудови на nav heirarchy
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]
Велике дякую