私のプロジェクトで互換性パッケージv4を使用していますが、ビューから削除した後にFragment
の周りに問題があります。私はActivity
の2つのフラグメントを表示しています...左側のメニューフレーム、右側のコンテンツペイン。メニューフレームには、表示可能な3つの異なるメニュー(フラグメント)があります。以前に表示されたフラグメントを復元するにはどうすればよいですか?
これは私がメニューフラグメントを交換しています方法です:
public void showMenuFragment(Fragment fragment, String tag) {
showFragment(R.id.menu_frame, fragment, tag, false);
setLastMenuPushed(tag);
}
protected void showFragment(int resId, Fragment fragment, String tag, boolean addToBackStack) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (fragmentManager.findFragmentByTag(tag) != null && fragment.isAdded()) {
transaction.remove(fragment);
}
transaction.replace(resId, fragment, tag).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).setBreadCrumbShortTitle(tag);
if (addToBackStack) {
transaction.addToBackStack(tag);
}
transaction.commit();
}
メニューFragment
sが、それが表示される前にロードするデータを必要とするので、私は、ローディングスピナーを示しています。初めてロードされると、Activity
が完了していない限り、2回目にロードする必要はありません。
私はFragmentManager.findFragmentByTag(String tag)
を使用してFragment
に合格しようとするが、それは常にnull
ですので、私は、私は別のメニューを表示する新しいFragment
たびに行う必要がありshowMenuFragment(...)
を呼び出します。
私の質問は、これらのメニューを他のメニューに置き換えた後、これらのメニューをどう保持しますか? Fragment
への手動参照を避けたいのですが、デバイスを回転させると、Activity
クラスのインスタンスが破棄され、それらの参照が失われるためです。
編集:もっと簡単に言えば、FragmentManager
は前のFragment
をバックスタックに追加することなく追跡してほしいです。私は戻るボタンを押して、表示されている前のメニューを見たくない。
これを振り返ってみると、より良い解決策は、アクティビティからフラグメントを「切り離し」、クラス内のハードリファレンスを保持することだったと思います。 –
detach vs hideのメリットは何ですか?ビューを破壊することは本当の違いをもたらしますか?フラグメント全体を再ロードせずに復元する良い方法はありますか? – ben
@ben Detachは画面からビュー階層を削除します。これはより環境に優しいアプローチです。ほとんどのビューは、フラグメントから削除されたときにインスタンス状態を保存するという良い仕事をしています。したがって、再接続すると大したことはありません。 –