私はこの構造を持っています:
アクティビティAにはViewPagerがあります。ViewPagerのページは、既知のフラグメントとして知られています。
アクティビティAには、ページに表示したい複雑なオブジェクトのリストがあります。
ユーザーがViewPagerアクティビティB内のアイテムをクリックすると、開始する必要があります。アクティビティBには、複雑なオブジェクトを含むリストも必要です。
だから私はこのリストに合格する必要があります
A->フラグメント->B
最初に、フラグメントのコンストラクターを使用してデータを渡すことはできないことを知りました。パーセル可能またはシリアル化可能を使用する必要があります。フラグメントでは、Bに渡すために、再度パーセルまたはシリアル化する必要があります。
しかし、複雑なデータのリスト全体を2回シリアル化またはパーセル化して、Bに到達させることはしたくありません。
静的フィールドの使用は避けたいです。
次に、リスナーをフラグメントに渡すことにしました。フラグメントは、アイテムのクリックをリッスンし、アクティビティAとアクティビティAに通知してから、データを使用してアクティビティBを開始します。Aは実際にはデータが属するものであるため、これは私にとって最もクリーンに見えます。したがって、Aはデータでフラグメントを開始し、フラグメントはAに戻り、AはデータでBを開始します。データをどこにでも渡す必要はありません(シリアル化!)。
しかし、シリアル化を使用してリスナーをフラグメントに渡すにはどうすればよいので、これは機能していないようです。フラグメント内のリスナーを使用してアクティビティに戻ることの何が問題になっていますか?
どうすればこれを解決できますか?
編集
ダイアログフラグメントに関するスレッドでこの解決策を見つけました:フラグメントダイアログからデータを取り戻す-ベストプラクティス?
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
そこで、これをフラグメントに追加して、アクティビティに特定のインターフェイスを実装させます。
これにより、フラグメントからBにデータを渡す問題が解決されます。ただし、リストをAからフラグメントに渡す必要があります。おそらく私はParcelableを使用する必要があります...
編集:私はParcelableを試しました、それは動作します。しかし、私のリスト内のオブジェクトには、たとえばマップも含めて、それらの間に多くのフィールドがあります。パーセラブルコードの記述(書き込み/読み取り)は面倒です。たぶん私は静的データに固執するだけです...