したがって、再初期化時にフラグメントがクラッシュしないようにするには、空のコンストラクターが必要であることを学びました。私の問題は、フラグメントが初期化されるときにフラグメントのデータのリストを使用することです (少なくともそれらの一部)。では、データのリストを使用して新しいフラグメントを開始するにはどうすればよいでしょうか。他のソースからデータを取得OnCreate()
するメソッドを作成する必要がありますか、それとも適切なアプローチでしょうか?getData
大量のデータがあるため、バンドルにデータを供給することは、実際にはあまり良い方法ではありません。
それでは、ケースを取り上げましょう(その方がはるかに優れていることを理解しています)。
ユーザーがボタンをクリックすると、フラグメントが開始されます。私が以前行っていたのは、この方法で新しいフラグメントを作成することでした:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
fragmentTransaction.addToBackStack(DETAIL_TAG);
fragmentTransaction.commit();
次に、私のフラグメントで:
public DetailFragment(EventItem item) {
mItem = item;
mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}
すべてのデータをバンドルに渡すことはできないため、機能しません。それで、私は何をすべきですか?
A: 空のコンストラクターでフラグメントを初期化し、アクティビティからセッターを使用してデータをフラグメントに直接設定する必要がありますか? ただし、ユーザーがホームを押して Android がフラグメントを閉じ、ユーザーが後で戻ってきた場合、データが失われることはありませんか?
B: ファクトリ パターンと callsetRetainInstance(true)
でフラグメントを初期化し、フラグメントにデータを識別するためのキーを与えてから、フラグメントに onCreateView で必要なデータを第 3 のソースから取得させる必要がありますか?
C: 空のコンストラクターを作成してonCreate()
から、フラグメントに必要なデータを取得する必要がありますか?
アプリは縦向きにロックされているため、問題は主に、Android を閉じてユーザーが再起動したときにオブジェクトを維持することにあることに注意してください。