[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
質問
Android Compatibility libraryを使用してフラグメントを実装していますが、レイアウトサンプルを拡張して、フラグメントにボタンが含まれ、それが別のフラグメントを起動するようにしました。
左側の選択領域には、5つの選択可能な項目があります。
A B C D E
.
それぞれがフラグメントをロードし (
FragmentTransaction:replace
を経由して) 詳細ペインに読み込まれます。
a b c d e
ここで、フラグメントを拡張して
e
を拡張して、別のフラグメントを読み込むボタンを含むようにしました。
e1
を読み込むボタンを含みます。私はこれをフラグメント
e
のonClickメソッドを以下のように変更しています。
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
以下のように選択すると
E - e - e1 - D - E
次に、フラグメント
e
が詳細ペインに表示されます。これは問題なく、私が望むものです。しかし、もし私が
back
ボタンを押しても何も起こりません。2回クリックする必要があるのは
e1
がまだスタック上にあるからです。さらに、クリックしまくった後、onCreateViewでヌルポインタ例外が発生しました。
この問題を「解決」するために、私は次のようなものを常に追加しました。
A B C D E
が選択されるたびに
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
これが正しい解決策なのか、それとも何か違うことをする必要があるのか、ちょっと考えてみてください。
どのように解決するのですか?
意図する動作に応じていくつかの方法がありますが、このリンクからすべての最適な解決策を得ることができます。
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
基本的に、以下のオプションがあります。
-
最初のバックスタック状態に名前を付けて
FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
. -
使用方法
FragmentManager.getBackStackEntryCount()
/getBackStackEntryAt().getId()
で、バックスタックの最初のエントリのIDを取得しFragmentManager.popBackStack(int id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
. -
FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
はバックスタック全体をポップするはずなのですが...。 というドキュメントがありますが は間違っていると思います。 (実際、私はそれが で渡す場合POP_BACK_STACK_INCLUSIVE
),
関連
-
[解決済み] ViewPagerとフラグメント - フラグメントの状態を保存する正しい方法は何ですか?
-
[解決済み] アンドロイド バックスタックをクリアする
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Androidの連絡先リストを呼び出すには?
-
[解決済み] アンドロイドアプリのユーザーデータを消去する
-
[解決済み] AndroidのimageviewがmaxWidthを無視する?
-
[解決済み] 開発者コンソールでのベータ版/アルファ版テストについての説明が必要です。
-
[解決済み] BackStackでFragment Animationを逆再生するには?
-
[解決済み] Androidで他のアクティビティを呼び出すときにアニメーションを表示させるには?
-
[解決済み] Android Studioがアプリに変更をデプロイしない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】IllegalStateException: ViewPager で onSaveInstanceState の後にこのアクションを実行できません。
-
[解決済み】フラグメントを使用してバックスタックをクリアする
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] アンドロイドアプリのユーザーデータを消去する
-
[解決済み] エラー Android Studioで名前'default'を持つ構成が見つかりません。
-
[解決済み] BackStackでFragment Animationを逆再生するには?
-
[解決済み] プログラムによるセレクタ画像の置き換え
-
[解決済み] 複数のローダーを持つLoaderManager: 正しいカーソルローダーを取得する方法