2013-11-15 43 views
3

對於我正在編寫的當前應用程序,我實現了一個導航抽屜(具有向後兼容性的默認Android方式)。 因此,從NAV抽屜選擇一個菜單元素,然後我做到這一點(addPreviousToBackStack始終是假的用於測試):重新打開和替換片段時,Android應用程序崩潰

private void replaceFragment(final Fragment fragment, final boolean addPreviousToBackStack) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.activity_main_fragment_container, fragment); 
    if(addPreviousToBackStack) { 
     fragmentTransaction.addToBackStack(fragment.getTag()); 
    } 
    fragmentTransaction.commit(); 
    currentFragment = fragment; 
} 

所以,當我啓動應用程序的工作原理就像一個魅力。然後我使用後退按鈕關閉應用程序。如果我然後重新打開應用程序(無論如何:通過長按主頁按鈕或通過快捷方式)應用程序開始在初始屏幕(onCreate被稱爲),然後我打開導航抽屜,選擇一個菜單項和應用程序崩潰。

這是我的例外:「java.lang.IllegalStateException:以後的onSaveInstanceState無法執行此操作」

而且它正好發生在我行,我做

fragmentTransaction.commit(); 

我不知道爲什麼當應用程序重新打開時,我得到這個,而不是當應用程序最初打開時。任何線索?

+0

這是Android的老式問題:)也許[我的答案來自類似的問題](http://stackoverflow.com/a/13987336/1051783)將幫助你。 – gunar

+0

嗯,沒有你的好方法或非正統的方式爲我工作...我試圖在4.3設備(星系連結) – dirkvranckaert

回答

0

我不確定你的用例的上下文是什麼,但調用fragmentTransaction.commitAllowStateLoss();不應該導致崩潰了。但是,您需要承擔您的狀態信息在片段上丟失的風險。

另外,這條線currentFragment = fragment;在我看來是內存泄漏的原因。如果Android想要清理片段,您可以通過保留片段的強引用來阻止它。不要使用它...

+0

Addding fragmentTransaction.commitAllowStateLoss();不起作用,它會像以前一樣崩潰......那麼我應該如何保持對片段的引用。我有時需要與片段交互,這就是爲什麼我保持在那裏...... – dirkvranckaert

+0

'getFragmentById(R.id.activity_main_fragment_container)'是如何獲得片段實例。然後,如果您需要訪問特定的方法,則會對您的片段類執行上傳。 – gunar

+0

我再次使用commitAllowStateLoss()進行了測試,似乎給我造成了:java.lang.IllegalStateException:活動已被破壞例外 – dirkvranckaert

相關問題