0

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

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

回答

1

我找到了解决问题的方法。 我只是在清单中为我的活动添加了android:configChanges="orientation|screenSize",它起作用!

+3

这是一种不好的做法..如果您有两种不同的布局,每种布局都有一种布局,则不会重新创建活动,布局也不会更改。 – ovluca

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

认为你应该保存CURRENTITEM在onSaveInstance和retrive它:

vPager.setCurrentItem(value_before_orientation_change); 

不是100%肯定,如果尽管我怀疑vPager实际上会覆盖你的片段。

编辑:

更可能的是,在onActivityCreated你CenterPanelFragment.java您提交的目录:

fragmentTransaction.replace(R.id.fragment_container, fragmentCatalog); 
    fragmentTransaction.addToBackStack("FragmentCatalog"); 
    fragmentTransaction.commit(); 

或许真的如setRetainInstance(真)在的onCreate简单的CenterPanelFragment可以解决此问题。

我相当有信心,方向更改重新启动您的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(); 
    } 
+0

谢谢!你是对的。 改变方向后我的CenterPanelFragment导致一个新的调用onActivityCreated和FragmentCatalog recreat。 我onActivityCreated使用状态,但它不工作: 我如何避免这种情况?(下面的代码) – Denis

+0

编辑我的回答,希望可以帮助您在正确的方向 – cYrixmorten

+0

谢谢,但它仍然不起作用 – Denis

0
if (savedInstanceState != null) 
{ 
    fragmentCatalog = (FragmentCatalog)getFragmentManager().getFragment(savedInstanceState, FragmentCatalog.class.getName()); 
} 
else 
{ 

    fragmentCatalog = new FragmentCatalog(); 
}