にいくつかのActivity
を含むがあります。これがアダプターです ( はのメンバーです。Fragment
ViewPager
mFooFragment
Activity
private class HomePagerAdapter extends FragmentPagerAdapter
{
public HomePagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position)
{
case 0:
mSellingFragment = new SellingFragment();
return mSellingFragment;
case 1:
mSearchFragment = new SearchFragment();
return mSearchFragment;
case 2:
mProfileFragment = new ProfileFragment();
return mProfileFragment;
}
return null;
}
@Override
public int getCount()
{
return 3;
}
}
そして、私は後で次のようなことをします:
mSellingFragment.refresh();
残念ながら、メンバーフラグメントはnull
. 私が問題なく確認できる 1 つのケース - ページは遅延ロードされているため、表示されるまで使用できません。refresh()
しかし、それは問題ありません。表示されているページでのみ操作したいのです。
しかし、時々それらはnull
目に見えるときでさえあります。何が起こっているかは次のとおりだと思います。
私のフラグメントはsetRetainInstance(true)
、アクティビティから離れると破棄されますが、フラグメントは保持されます。その後、アクティビティに戻ると、古いフラグメントでアクティビティが何らかの形で再作成され、getItem()
呼び出されないため、mFooFragment
設定されません。
そうですか?これをどのように正確に処理することになっていますか?私が考えることができる 1 つの方法はsetFooFragment(FooFragment f) { mFooFragment = f; }
、Activity に多数の関数を追加して呼び出すことですFooFragment.onAttach()
が、もっと良い方法があるはずです!
編集
(多くの場合、Android ランドで回答を得る唯一の方法です!)のソース コードを調べましたがFragmentPagerAdapter
、フラグメントを保存するのは実際の場合です。
@Override
public Object instantiateItem(View container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), position));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
}
return fragment;
}
Fragment
残念ながら、これらの再接続された をサブクラスで使用できるようにはなりません!