Androidプラットフォームで、アプリケーションのようなウィザードを実行するための最良の方法はどれだと思いますか(ユーザーは[次へ]ボタンと[戻る]ボタンで画面間を移動でき、各画面はいくつかの状態データを保存する必要があります)。
私は主に2つのアプローチで考えることができます:
画面ごとに1つのアクティビティとビューを用意し、各アクティビティを呼び出して画面を切り替えます。これを素晴らしいものにしているのは、システムの戻るボタンをバックハンドラーとして使用でき、自分でそれを処理する必要がないことです。また、各アクティビティがそれ自体の状態を保存します。
1つのアクティビティと多くのビューがあり、各画面でビューを切り替えると、より多くのコードを再利用できますが、状態の保存が混乱します。
どう思いますか? Androidでこれを行うための最良の方法はどれですか?
アクティビティとビューの目標に合うので、2を使用することをお勧めします。この場合の状態の保存は簡単です。MVCパターンを使用すると、ビューに渡されるモデルオブジェクトを簡単に作成できます。各ビューには、読み取り/書き込みが可能なモデルの部分があります。どこにいても、モデルは常に現在の状態である必要があります。処分された場合は、モデルを保存するだけです。各ページを表示するときにモデルから既に読み取ったため、復元は自動的に機能します。
Androidナビゲーションコンポーネント をViewModelsと組み合わせて使用して、ウィザードフローを構築します。
軽量のAndroidライブラリを開発しました。これはAndroidのViewPagerの上に構築されており、ウィザードのようなアクティビティの作成に使用できます。チェックしてください: WizarDroid 。
より自然に見えるので、私は最初のアプローチを採用しました。別のアプリはビューの切り替えにViewFlipper
を使用しますが、それはウィザードのようなものとはほど遠いものです。
2の方がいいと思います。各「ページ」をビューに配置してから、表示と非表示を交互に切り替えます。ニーストランジションを行うのは簡単です。どのような状態を維持することを考えていますか?自動的に機能しないのはフォーカスだけで、ページを切り替えるたびにそれをリセットしたいと思うでしょう。それがアプリの正しい動作であると思われる場合は、キャッチバックすることも簡単です。
1を使用すると、ほとんどすべてのコードを再利用できます(独自のWizardBaseクラスを定義するだけです)が、ビューを切り替えるよりもアクティビティの起動がはるかに遅い(そしてより多くのメモリが必要)と思います。
9年前、これは明らかに非常に異なる魚のやかんでしたが、今これを行う最良の方法はフラグメントを使用することだと思います。
ウィザードの「ページ」ごとにフラグメントを作成し、独自のライフサイクルと状態を処理できるようにします。
各フラグメント内からページを変更するには Fragment.getFragmentManager() -これにより、親アクティビティからFragmentManagerが返され、フラグメントがそれ自体を置き換えることができます。