片段与活动轮换重叠

Jac*_*ień 4 android android-fragments

我对此非常困惑.我有一个actionbar列表导航.我点击列表fragment一个接一个地打开2 并显示在同一个活动中.我基本上用这种方法替换它们:

public void openFragment(AprilAppsFragment createdFragment){        
    if (createdFragment.getClass().isInstance(getDisplayedFragment()))
        return;

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    transaction.replace( R.id.main_fragment, createdFragment, "displayed fragment"); 
    transaction.addToBackStack(null);
    transaction.commit();  
}
Run Code Online (Sandbox Code Playgroud)

我打开片段A,然后打开片段B,然后旋转屏幕.片段A正在重新创建崩溃我的应用程序

是的,因为我正在使用替换?如何避免重新创建不再显示的片段,而不会失去对其进行反压的可能性?

Ali*_*liR 9

您的问题是您没有为片段保存状态,因为您还没有添加

android:configChanges="orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)

您的第一个片段再次被调用,因为您没有保存状态,您的应用程序崩溃了.因此,您可以在清单中的活动声明中添加上面的行,例如:

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)

并覆盖onSaveInstanceState并保存两个片段的状态.在你的onCreate中只需做这个检查:

if(savedInstanceState != null){
fragmentA = (FragmentA) fragmentManager.getFragment(savedInstanceState, stringValueA);
fragmentB = (FragmentB) fragmentManager.getFragment(savedInstanceState, stringValueB);
}
Run Code Online (Sandbox Code Playgroud)

然后检查您的任何片段是否为空,而不是创建其实例并将其设置为fragmentTransaction.relplace.或者在openFragment方法中执行此操作.

干杯,