我有一个Activity
,其中ViewPager
中包含一些Fragment
。这里是适配器(该mFooFragment
的是Activity
成员从活动获取ViewPager片段
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; }
函数加载到活动中,并从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
可用于子类!