Проблемы с задним стеком фрагмента 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]

Большое спасибо

Ответы на вопрос(8)

Ваш ответ на вопрос