0
我有MainActivity並且裏面有一個FragmentLayout。當使用此代碼選擇標籤(如instagram)時,我在該佈局中顯示不同的片段。片段的childfragmentmanager getFragments()在替換後返回null
MABaseFragment fragment = mBackStackOfFragment.get(getStackNo(stack)).peek();
ft.replace(R.id.contentFrame, fragment).
currentVisibleFragment = fragment;
在該片段我有Viewpager與母體片段的創建childfragmentmanager之一。我用此代碼創建父代片段
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
List asd = getChildFragmentManager().getFragments();
if(view == null)
{
view = inflater.inflate(R.layout.fragment_search, container, false);
setHasOptionsMenu(false);
actionBar = MAMainActivity.mainActivity.getSupportActionBar();
mViewPager = (ViewPager) view.findViewById(R.id.pager);
mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.pager_title_strip);
mViewPager.setOffscreenPageLimit(numberOfTabs);
mSlidingTabLayout.setDistributeEvenly(true);
pagerAdapter = new MASearchFPA(getContext(), getChildFragmentManager());
mViewPager.setAdapter(pagerAdapter);
mSlidingTabLayout.setViewPager(mViewPager);
mSlidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getResources().getColor(R.color.colorPrimary);
}
@Override
public int getDividerColor(int position) {
return getResources().getColor(R.color.colorPrimary);
}
});
}
return view;
}
而且我保留每個片段的參考,因爲允許用戶繼續他們離開的地方。它運作良好,與不具有嵌套的片段,但是當這個分片嵌套應用程序替換當前片段等片段崩潰
01-11 12:36:08.239 20857-20857/tr.com.meeapps.livyapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: tr.com.meeapps.livyapp, PID: 20857
java.lang.IllegalStateException: Fragment no longer exists for key f0: index 0
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:692)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1453)
at android.view.View.dispatchRestoreInstanceState(View.java:15637)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3268)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3274)
at android.view.View.restoreHierarchyState(View.java:15615)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:477)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1135)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
,因爲我認爲childfragmentmanager的mActive列表是空替代方法曾經被稱爲後是返回null到Viewpager 。
所以我不知道爲什麼孩子片段的mActive片段在更換後爲空。有什麼辦法來防止這種行爲。 謝謝。
編輯
我的適配器類
public class MASearchFPA extends FragmentStatePagerAdapter {
Context context;
MACategoriesFragment categoriesFragment;
MAMapFragment mapFragment;
MAFavoritesFragment favoritesFragment;
FragmentManager fm;
public MASearchFPA(Context context, FragmentManager fm) {
super(fm);
this.context = context;
this.fm = fm;
categoriesFragment = new MACategoriesFragment();
mapFragment = new MAMapFragment();
favoritesFragment = new MAFavoritesFragment();
}
@Override
public Fragment getItem(int position) {
if(position == 0) // if the position is 0 we are returning the First tab
{
return categoriesFragment;
}
else if(position == 1) // As we are having 2 tabs if the position is now 0 it must be 1 so we are returning second tab
{
return mapFragment;
}
else
{
return favoritesFragment;
}
}
@Override
public int getCount() {
return MASearchFragment.numberOfTabs;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return context.getResources().getString(R.string.categories);
case 1:
return context.getResources().getString(R.string.map);
case 2:
return context.getResources().getString(R.string.favorites);
default:
return null;
}
}