私は非常に大きな問題を抱えており、何が起こっているのかかなり分かりません。私は(サポートライブラリからの)Fragmentsを使用するアプリケーションを開発しており、FragmentTransaction.replace()
を使用して新しいフラグメントをバックスタックに置き、古いものを置き換えています。コードは次のようになります。FragmentTransaction.replace()を使用した場合のAndroid Fragmentビューの状態の損失
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
これは、私の断片を置き換えるのに成功しています。私の問題は次のとおりです。 1つのフラグメントでは、ユーザー入力から作成されたアイテムのリストがあります。次に、ユーザーが次へをクリックして戻るボタンをクリックすると(リストに戻る)、ビューは破棄されるため、リストは空になります。今、私は次のことに気付いた:
- onSaveInstanceStateが呼び出されていない。これは、親アクティビティーが指示するときにのみ呼び出されるからです。ドキュメントに基づいて: "(UIが表示されていないバックスタックに置かれたときのように)フラグメントが大部分が分解される可能性がある多くの状況がありますが、その所有アクティビティが実際にその状態を保存する必要がある"。どうやら、FragmentTransactionでの置換の実行はその時代の一つではありません。誰かがこれまたはより良い説明を確認していますか?
- この状況では、setOnRetainInstanceState(true)は役に立ちません。ここでも、私はこれがドキュメントの情報と関係していると考えています。「フラグメントインスタンスがアクティビティの再作成(コンフィグレーションの変更など)全体で保持されるかどうかを制御する」私はアクティビティを再作成する際に何もしませんので、これは役に立たないものです。
私の主な質問は、replace
を使用している場合、ビューステート(単にフラグメントを保持する)を保持する方法があるのでしょうか? FragmentTransaction.add()
がありますが、これにもいくつかの問題があります。 1つは終了アニメーションが実行されないため、アニメーションが正しくありません。もう1つは、古いフラグメント(非可視状態にされているフラグメント)がまだクリック可能であるという新しいフラグメントです。例えば、私がListFragmentを持っていて、addを使ってその上にコンテンツフラグメントを置くと、ListFragment内のリストアイテムをクリックすることができます。