2 zxd 72 zxd_72 于 2013.05.23 10:38 提问

activity 旋转时 Fragment 重叠

我在程序中设置了一个 actionbar,在 actionbar 中有导航列表。我点击列表连续打开2个fragment,并显示在相同的activity中。

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

我先打开 fragment A,然后打开 fragment B,再旋转屏幕。Fragment A 被重新创建了导致程序崩溃。
如何避免重新创建fragment然后就不再显示?

2个回答

hxn_217
hxn_217   2013.05.27 11:27
已采纳

你的问题是没有为 fragments 保存状态,因为你没有添加android:configChanges="orientation|screenSize"
因为你没有保存的状态应用程序崩溃,第一个 fragment 又调用一次。所以要在 manifest 中添加:

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"

重写 onSaveInstanceState 方法,保存 fragments的状态。
在 onCreate 中添加:

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

然后检查 fragment 是否为空,然后创建它的实例,在 fragmentTransaction.relplace 中设置,或者在 openFragment 方法中设置。

hadues
hadues   2015.10.24 13:07

你的问题是没有为 fragments 保存状态,因为你没有添加android:configChanges="orientation|screenSize"。
因为你没有保存的状态应用程序崩溃,第一个 fragment 又调用一次。所以要在 manifest 中添加:

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"

感谢 hxn_217的回答,我今天也遇到了这个问题

不过我只修改了AndroidManifest.xml中添加了

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"

并没有使用后面的步骤,也成功了。

Csdn user default icon
上传中...
上传图片
插入图片