3

私はこの構造を持っています:

アクティビティ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を試しました、それは動作します。しかし、私のリスト内のオブジェクトには、たとえばマップも含めて、それらの間に多くのフィールドがあります。パーセラブルコードの記述(書き込み/読み取り)は面倒です。たぶん私は静的データに固執するだけです...

4

1 に答える 1

2

あなたが見つけたリスナーソリューションは優れており、実際にGoogle(http://developer.android.com/training/basics/fragments/communicating.html)によって推奨されています。

フラグメントにデータを渡すという残りの問題については、ViewPagerの各フラグメントのリストの要素だけでなく、リスト全体を渡す必要がありますか?要素だけが必要な場合は、次のようにすることができます。

    /*
     * An adapter for swiping through the fragments we have.
     */
    private class CustomPagerAdapter extends FragmentStatePagerAdapter {

        List<Thing> things;

        public CustomPagerAdapter(FragmentManager fragmentManager, List<Thing> things) {
            super(fragmentManager);
            this.things = things;
        }

        @Override
        public int getCount() {
            return things.size();
        }

        @Override
        public Fragment getItem(int position) {
            return ThingFragment.newInstance(things.get(position));
        }
    }

    /*
     * Loads a view based on the thing.
     */
    private static class ThingFragment extends Fragment {

        private String name;

        static ThingFragment newInstance(Thing thing) {

            ThingFragment f = new ThingFragment();

            // add some arguments to our fragment for onCreateView
            Bundle args = new Bundle();
            args.putString("name", thing.getName());
            f.setArguments(args);

            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            name = getArguments().getString("name");
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View v = inflater.inflate(R.layout.thing_fragment_layout, container, false);
                    TextView t = (TextView)v.findViewById(R.id.thingText);
            t.setText(name);
            return v;
        }
    }

そして、リストをアダプターに渡します。もちろん、これにはダイナミクスを動的に作成する必要がありますが、xmlフラグメントの拡張は非常に簡単です。

実際にリスト全体を渡す必要がある場合は、ええ、個々の複雑なオブジェクトをParcelableにしてから、Bundle.putParcelableArray()のようにFragment引数に追加する必要があります。

于 2012-06-21T10:29:33.250 に答える