我可能没有完全理解您的代码,但我怀疑您的 MainActivity 的 onCreate 中有这一点:
frAdapter = new FragmentAdapter(getSupportFragmentManager());
vPager = (ViewPager)findViewById(R.id.pager);
vPager.setAdapter(frAdapter);
vPager.setCurrentItem(1);
vPager.setOnPageChangeListener(this);
vPager.setOffscreenPageLimit(3);
认为您应该将 currentItem 保存在 onSaveInstance 中并检索它:
vPager.setCurrentItem(value_before_orientation_change);
不是 100% 确定 vPager 是否真的像我怀疑的那样覆盖了您的片段。
编辑:
更有可能的是,在 onActivityCreated 的 CenterPanelFragment.java 中提交目录:
fragmentTransaction.replace(R.id.fragment_container, fragmentCatalog);
fragmentTransaction.addToBackStack("FragmentCatalog");
fragmentTransaction.commit();
也许像 CenterPanelFragment 的 onCreate 中的 setRetainInstance(true) 这样简单的东西可以解决这个问题。
我非常确信方向更改会重新启动您的 CenterPanelFragment,从而导致对 onActivityCreated 的新调用。
认为您可以在FragmentCatalog中尝试:
并更改此行:
fragmentTransaction.replace(R.id.fragment_container, fcAllStone);
至:
fragmentTransaction.replace(R.id.fragment_container, fcAllStone, "fragment_stone");
现在在CentralPanelFragment:
if (savedInstanceState != null)
{
Log.d(MainActivity.tag, "CenterPanelFragment not null");
fragmentCatalog = (FragmentCatalog)getFragmentManager().getFragment(savedInstanceState, FragmentCatalog.class.getName());
// see if stone is open
if (savedInstanceState != null) {
FragmentCatalogStone fragmentStone = (FragmentCatalogStone) getFragmentManager()
.findFragmentByTag("fragment_stone");
if (FragmentCatalogStone != null) {
/*
* maybe recommit it, dont actually think anything is needed
* since moving the below code inside the else statement
* prevents it from overwriting the FragmentCatalogStone
*/
}
}
else
{
Log.d(MainActivity.tag, "CenterPanelFragment null");
fragmentCatalog = new FragmentCatalog();
android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.replace(R.id.fragment_container, fragmentCatalog);
fragmentTransaction.addToBackStack("FragmentCatalog");
fragmentTransaction.commit();
}