我有一个Activity
包含一些Fragment
s 的 a ViewPager
。这是适配器(mFooFragment
's 是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
. 一种情况我可以接受并且可以检查 - 页面是延迟加载的,因此在显示之前它们不可用。不过没关系,我只想refresh()
对可见页面进行操作。
但有时它们null
甚至是可见的。我认为正在发生的事情是这样的:
我的片段有setRetainInstance(true)
所以当我离开活动时它被破坏但片段被保留,然后当我回到它时,活动以某种方式用旧片段重新创建,并且getItem()
永远不会被调用,所以mFooFragment
永远不会设置。
是对的吗?究竟应该如何处理这个问题?我能想到的一种方法是向setFooFragment(FooFragment f) { mFooFragment = f; }
Activity 添加大量函数并从中调用它们,FooFragment.onAttach()
但必须有更好的方法!
编辑
我查找了FragmentPagerAdapter
(通常是在 Android 领域获得答案的唯一方法!)的源代码,它确实保存了片段:
@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
的 s 可用于子类!