我在更改方向后保存当前片段的状态时遇到问题。 我有网格视图的片段,我在片段的导航过程中替换。 启动应用后的操作。
1)启动“MainActivity”。
2)添加“CenterPanelFragment”(这是内部片段的容器)。
3)替换“CenterPanelFragment”片段“FragmentCatalog”(GridView)。图1。
4)如果我点击“FragmentCatalog”的gridview项目,它将补充片段“FragmentCatalogStone”(Gridview)。图2。
5)之后我改变了设备的方向,你可以看到我在横向方向上获得了片段“FragmentCatalog”而不是横向方向的片段“FragmentCatalogStone”。图3
我做错了什么? 我附上了必要的课程文件。
抱歉我的英语很差。
非常感谢!
答案 0 :(得分:1)
我找到了解决问题的方法。
我只是在我的活动清单中添加了android:configChanges="orientation|screenSize"
,它确实有用!
答案 1 :(得分:0)
我可能不完全理解你的代码,但我怀疑你的MainActivity中的这一点是onCreate:
frAdapter = new FragmentAdapter(getSupportFragmentManager());
vPager = (ViewPager)findViewById(R.id.pager);
vPager.setAdapter(frAdapter);
vPager.setCurrentItem(1);
vPager.setOnPageChangeListener(this);
vPager.setOffscreenPageLimit(3);
认为你应该在onSaveInstance中保存currentItem并检索它:
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();
}
答案 2 :(得分:0)
if (savedInstanceState != null)
{
fragmentCatalog = (FragmentCatalog)getFragmentManager().getFragment(savedInstanceState, FragmentCatalog.class.getName());
}
else
{
fragmentCatalog = new FragmentCatalog();
}