我有一個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
可用於子類!