2011-09-19 51 views
32

後我遇到了一個問題,我有一個活動與多個片段。對於任何單獨的片段,您可以執行搜索操作,這很好......如果您從任何片段搜索,它將顯示一個新的「活動」來處理搜索,然後將結果返回到「活動」以處理顯示新的片段。問題是,搜索操作後,我希望能夠清除(幾乎)遠離使用popBackStackImmediate(...)以來saveInstanceState(...)的所有片段是所謂的,我得到的是說,一個例外:popBackStack()saveInstanceState()

"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState" 

不知道如何流行onSaveInstanceState已被調用後從後面的堆棧?

回答

1

如何在開始關聯活動之前立即彈出堆棧? onSaveInstanceState在調用startActivity之前不會被調用(並且新活動在當前one0之前...之前立即彈出片段堆棧回到您想要的狀態然後調用startActivity)

由於片段堆棧是一個普通的任務/回棧的層,我認爲修改它「從中間」會導致問題,這就是爲什麼你看到這個問題。

19

顯然我的問題產生於在onActivityResult (...)

我能夠通過將UI修改代碼放入Runnable中,然後將Runnable發佈到主線程來解決此問題:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     // UI code here 
    } 
}; 
Handler h = new Handler(); 
h.post(r); 
+0

你剛剛救了我的人。我幾乎瘋了,試圖找出什麼是錯的。 +1 – Dimanoid

+0

解決了我遇到的問題! SingleTop活動,在onNewIntent中彈出片段backstack。使用AndroidAnnotations在我的方法中添加@UiThread來修復崩潰。 –

+6

在您的邏輯之前首先調用super.onActivityResult,並且問題將得到解決,因爲FragmentActivity的onActivityresult調用mFragments.noteStateNotSaved(); – Shilpi

14

通話super.onActivityResult你的邏輯和問題之前,首先會得到固定爲FragmentActivity的onActivityResult電話mFragments.noteStateNotSaved();

+0

謝謝,你救了我一天哈哈 –

4

這個答案可以幫助別人。當你的活動不可見時,你無法調用popBackStackImmediate(...)它會拋出非法異常:不能在onsaveinstancestate後執行這個動作。

取而代之的是,您可以檢查活動是否可見?在調用popBackStackImmediate()之前。

如果您的活動不可見,請勿調用popBackStackImmediate。 當活動再次打開時,通過布爾標誌可以實現

+0

不理解最後一部分。因此,如果我的活動不可見,而且我不執行操作,那麼一旦活動可見,我怎麼知道我應該這樣做? –

+0

如果您想調用popBackStackImmediate(...),當您的活動不可見時。將布爾值設置爲true。 當你的活動來到前臺,在活動onResume()你可以檢查布爾值,如果它是真的,那麼你可以調用popBackStackImmediate(...) – Thirumalvalavan

+0

究竟是如何?你可以用代碼示例編輯你的答案嗎? –