4

だから、私は Android のサポート v4 ライブラリから ViewPager を使用しようとしていますが、それ (または FragmentPagerAdapter) がフラグメントを処理する方法にいくつかの深刻な問題があります。たとえば、次のことを行うために FragmentPagerAdapter をサブクラス化しました。

public class MyPagerAdapter extends FragmentPagerAdapter
{
private ArrayList<Fragment> fragments = null;
private ArrayList<Data> data = null;

public MyPagerAdapter(FragmentManager fragmentManager, ArrayList<Data> data)
{
    super(fragmentManager);

    this.data = data;

    fragments = new ArrayList<Fragment>();

    for(Data datum : data)
    {
        MyDataFragment fragment = new MyDataFragment();
        fragment.setData(datum);
        fragments.add(fragment);
    }
}

@Override
public Fragment getItem(int i)
{
    return fragments.get(i);
}

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

これで十分であり、Fragments が通常実装MyDataFragmentするメソッドを使用して実装できると考えました。onCreateViewしかし、興味深い問題に遭遇しました。アクティビティから移動してから戻ると、ViewPager が空白に表示されます。どういうわけか、findFragmentByTag を呼び出して Fragments を再利用していましたが、単に を呼び出すことさえしませんでした。さらに悪いことに、Fragment はイベントgetItemを取得しません。onCreateViewそこで、ViewPager の Fragment キャッシュを利用できると考えましたonCreateView。これは、主に、フラグメントが膨張するさまざまなビューへの参照を取得するコードをonAttach. 唯一の問題は、実行中onAttach、MyDataFragment のgetViewメソッドが常に null を返すことです。オンラインの Fragments の例はすべて、次のことを説明しています。onCreateViewビュー設定コードがすべて含まれている必要があります。いいよ。しかし、 のようなメソッドを作成するときは、MyDataFragment.setSomeField(String value)への参照を使用する必要がありますTextView。は常に呼び出されるとは限らないためonCreateView(たとえば、フラグメントが FragmentPagerAdapter によって魔法のようにリサイクルされる場合など)、 でその参照を取得することをお勧めしますonAttach。ただし、 の間onAttach、フラグメントのルート ビューはまだ null です (おそらくonCreateView最初に呼び出されなかったためです)。onActivityCreatedその後、追加のイベントは発生しないため (フラグメント自体とは関係のない を除いて)、セットアップ コードを実行する場所がありません。これはどのように機能するはずですか?ここで何か重要なことを見逃しているのでしょうか、それとも Fragment システムはサルによって設計されたのでしょうか?

4

1 に答える 1

1

これが FragmentPagerAdapter の適切な使用例かどうかはわかりません (ListAdapter でやりたいことのように思えます)。

FragmentPagerAdapterドキュメントから:

ユーザーがページに戻ることができる限り、フラグメント マネージャーに永続的に保持されるフラグメントとして各ページを表す PagerAdapter の実装。

このバージョンのページャーは 、一連のタブなど、通常はより静的なフラグメントをページングする必要がある場合に使用するのに最適です。ユーザーがアクセスする各ページのフラグメントはメモリに保持されますが、ビュー階層が表示されない場合は破棄される可能性があります。フラグメントインスタンスは任意の量の状態を保持できるため、これにより大量のメモリが使用される可能性があります。より大きなページ セットの場合は、FragmentStatePagerAdapter を検討してください。

FragmentStatePagerAdapter またはおそらくListAdapterに切り替えることを検討します。createView を呼び出す必要がある場合は、毎回再作成する必要があります (古いフラグメントを破棄して新しいフラグメントを作成する) が、それはあなたが望むものではないと思います。

于 2014-03-29T22:35:19.613 に答える