Проблемы с задним стеком фрагмента Android
У меня есть огромная проблема с тем, как работает backstack фрагмента Android и я был бы очень признателен за любую помощь, которая предлагается.
Представьте, что у вас есть 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"
/>
Update Это код, который я использую для сборки с помощью 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]
Большое спасибо