21

Android タブレット アプリケーションの場合、2 つのフラグメントを使用します。画面の左側に 1 つ、右側に 1 つ。右側のフラグメントのボタンをクリックすると、右側のフラグメントの上に別のフラグメントが追加されます。このフラグメントはバックスタックに追加されます。

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.add(R.id.fragmentlayout, fragment2);
ft.addToBackStack("Fragment2");
ft.commit();

バックスタックは次のようになりました。

[フラグメント 1] -> [フラグメント 2]

左側には、左側のフラグメント (fragment2 と同じ) の上にフラグメントを開き、それをバックスタックに追加するボタンもあります。バックスタックは現在

[フラグメント 1] -> [フラグメント 2] -> [フラグメント 3]

フラグメント 2 には、そのフラグメントを閉じるボタンがあります。

getFragmentManager().popBackStack("Fragment2", FragmentManager.POP_BACK_STACK_INCLUSIVE);

問題は、[フラグメント 2] だけを閉じたい場合、[フラグメント 3] も破棄されることです。呼び出すことで手動でフラグメントを削除できます

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment2).commit();

しかし、バックスタックは残ります

[フラグメント 1] -> [(ゴースト) フラグメント 2] -> [フラグメント 3]

そのため、もう一度押してアプリケーションを閉じる必要があります。

[フラグメント 2] のみをバックスタックから削除し、[フラグメント 3] を画面に残す方法はありますか?

4

4 に答える 4

5

独自のバック スタックを作成し、オーバーライドonBackPressed()して、適切と思われる方法で処理することができます。望ましい動作を達成する他の方法はないと思います。

独自のバック スタックは、単にArrayListフラグメントのタグである可能性があります。

于 2013-07-10T05:20:42.363 に答える
2

同様の質問に答えたので、その回答へのリンクを次に示します

この実装によりFragment、バックスタックのどこからでも a を削除できます。これは、リフレクションを使用して、バックスタック情報を格納する内部変数を変更することによって実現されFragmentManagerImplますBackStackRecord

使用を推奨するものではありませんが、お役に立てば幸いです。

于 2014-03-02T09:46:13.803 に答える
0

この解決策は、あなたの場合にのみ機能します。Fragment2 をバックスタックに入れる必要はありません。できることは、コード「ft.addToBackStack("Fragment2");」を削除することです。Fragment2 はスタックにないため、Fragment2 を閉じて [fragment 3] を画面に残します。

于 2013-11-20T04:02:52.827 に答える