質問: AndroidのFragmentでActivityみたいな画面遷移を実装したいですがいい方法が見つかりません。 具体的に言いますとa,b,cのActivityがあってaからbに遷移し、バックキーなどでaに戻るこの時にaは、bに遷移する前のViewの状態は保持されてます。(ScrollViewのスクロール位置やCheckBoxのOn/Offとか)。これをFragmentで実装したいです。 あと、bからcに遷移しcからaに遷移します。この時にb,cは消去します。これはActivityだとIntentにFLAG_ACTIVITY_CLEAR_TOPのフラグを付ければ実現できます。これと同じことをしたいです。 インターネットで実装方法を探したところしっくりする方法が見つかりませんでした。なので自分で試行錯誤やりましたが、最終的に下記のような方法になりましたが、問題点が残る実装となってしましました。こんなやり方しかないのか、他にいい方法があるのか教えて頂けないでしょうか。いい参考サイトがあればそれを教えて下さるだけでも結構です。おねがいします。 ○画面遷移 FragmentTransaction#add(int,Fragment,String)を利用する、これだけだと前画面も表示されぱなしみたいなので、FragmentTransaction#hide(Fragment)を利用し非表示にします。 ○現画面を消去し前回の画面に戻る FragmentTransaction#remove(Fragment)を利用し現在表示されている画面を消去します。これだけだと、前回画面は非表示のままなので、show(Fragment)で再表示します。 ○重ねた画面を全部消去し一番最初の画面を表示する(前述のFLAG_ACTIVITY_CLEAR_TOPの実装) FragmentManager#getFragments()で重ねたFragmentを全部取得しFragmentTransaction#remove(Fragment)で消去する。それで一番最初の画面をFragmentTransaction#add(int,Fragment,String)を利用し追加する。 ○問題点 ・show(),hide()を利用したFragmentはライフサイクルが発生しない ・FragmentTransaction#add(int,Fragment,String)を利用したFragmentのタグはコレクションで管理しないといけなくなってしまったので、面倒。
回答: `FragmentManager`の`replace`と`popBackStack`を使えばどうでしょうか? 画面遷移: ``` fragmentManager .beginTransacton() .replace(R.id.container, fragmentB) .commit(); ``` 戻る時はデフォルトの`onBackPressed`で`popBackStack`されると思いますので、次のようなことは明示的にする必要もないでしょう: ``` fragmentManager .popBackStack(); ``` 戻る必要のない遷移の時は、先に既存のバックスタックを消去してから、通常の遷移の処理をすればokです。 ``` fragmentManager .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); ```