私は、androidフラグメントのバックスタックが機能しているように見える方法に大きな問題を抱えており、提供されたヘルプに最も感謝しています。
あなたが3つのフラグメントを持っていると想像してください
[1] [2] [3]
ユーザーがナビゲートできるようにし[1] > [2] > [3]
ながら、戻る途中([戻る]ボタンを押す)にしたい[3] > [1]
。
私が想像したように、これは、XMLで定義されたフラグメントホルダーにaddToBackStack(..)
フラグメントをもたらすトランザクションを作成するときに呼び出しを行わないことによって達成[2]
されます。
この現実は[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]
どうもありがとう