更改方向后保存片段状态的问题

时间:2013-09-23 19:39:29

标签: android gridview android-fragments actionbarsherlock savestate

我在更改方向后保存当前片段的状态时遇到问题。 我有网格视图的片段,我在片段的导航过程中替换。 启动应用后的操作。

1)启动“MainActivity”。

2)添加“CenterPanelFragment”(这是内部片段的容器)。

3)替换“CenterPanelFragment”片段“FragmentCatalog”(GridView)。图1。

4)如果我点击“FragmentCatalog”的gridview项目,它将补充片段“FragmentCatalogStone”(Gridview)。图2。

5)之后我改变了设备的方向,你可以看到我在横向方向上获得了片段“FragmentCatalog”而不是横向方向的片段“FragmentCatalogStone”。图3

我做错了什么? 我附上了必要的课程文件。

抱歉我的英语很差。

非常感谢!

1 2 3

MainActivity.java

CenterPanelFragment.java

FragmentCatalog.java

FragmentCatalogStone.java

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();
}