我在程序中设置了一个 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然后就不再显示?
你的问题是没有为 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 方法中设置。
你的问题是没有为 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"
并没有使用后面的步骤,也成功了。