我在程序中設置了一個 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 方法中設置。