だから、私は 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 システムはサルによって設計されたのでしょうか?