Fragments を使用して、アプリケーションのさまざまなビューを表しています。ビュー間を移動するときに、次のコードを使用してフラグメントを置き換えます。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
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.main_linearlayout_fragmentcont, frag);
ft.addToBackStack(null);
ft.commit();
回転時に多くの問題が発生し、アクティビティが再構築されました。Android の古いバージョンをサポートする必要があるため、 android:configChanges="orientation" はオプションではありません。多くの問題は、Android が Fragment 状態を保存する方法の性質によるものです。
これらは私が遭遇している問題です:
1) Fragment トランジションは、回転後に自動的に復元されるポップ イベントのカスタム アニメーションを記憶しません。しかし、彼らは私の BackStack を覚えています。アニメーションを使用して置換を行い、ポップをすべて一緒に取り除く独自のバックハンドラーを作成できることはわかっていますが、 popBackStack() を呼び出す前にアニメーションをリセットする方法、または FragmentManager に記憶させる方法があるかどうか疑問に思っていました回転後に自動復帰するときのアニメーション。
2) 私が抱えているもう 1 つの問題は、独自のフラグメントを含む最上位のフラグメント ビューの 1 つに、多数の子ビュー (linearlayouts) があることです。これらの子ビューは、プログラムによって作成および設定されます。ローテーション後にフラグメントが再作成されると、フラグメント オブジェクトの onCreateView で子ビューをプログラムで再構築し、各子ビューの下にフラグメントが重複してしまいます (1 - プログラムで作成し、1 - Android フラグメントが復元から作成されます)。これは、回転後に同じIDで子ビューをプログラムで再構築したためだと思います。フラグメントが復元されないようにする方法はありますか? Android はいつ、savedState の Fragments を私がプログラムで作成したこれらのビューに挿入しますか? これを防ぐにはどうすればよいですか?
3) 上記の置換コードは、frag (フラグメント) オブジェクトに対して onCreateView を複数回起動するようです。これはローテーションなしで、上記のコードを 1 回だけ実行すると発生します。上記のコードで Fragment の onCreateView が複数回呼び出される理由はありますか?
フラグメントに関する質問: 1) アクティビティの再構築時に Android がフラグメントを自動復元しないようにすることはできますか? これについてどうすればいいですか?LinearLayout の ID に基づいていますか? フラグメント onStop を含む LinearLayout の removeAllViews を呼び出すことができますか? そうすれば、保存時にビューは存在しませんか?
2) 参照はあるが ID を持たない LinearLayout に Fragment を追加する方法はありますか? フラグメントの追加、置換 API には int ID が必要なようです。
ありがとう!