3

好的。我的第一個問題。我已經找到了一些解決方案,但老實說,並沒有真正獲得後臺發生的事情。所以也許有人能夠澄清這個問題。經過幾天的調試,我很高興它可以工作......並希望我沒有犯一些嚴重的錯誤。所以我們來看看。方向變化,FragmentTransaction,活動已被破壞,WeakReference

我有一些主要活動。只是一個片段活動延伸JFeinstein’s SlidingFragmentActivity。此外,我決定採用片段方式,並將任何內容(list-fragment,art​​icle-fragment,...)作爲片段放入一個容器中(滑動菜單的右側)。我的主容器。到現在爲止還挺好。

一個重要的片段是我的文章片段。一個ViewPager(帶有FragmentStatePagerAdapter) - 包含一些帶有文本和可能是另一個列表片段的頁面。到目前爲止,仍然沒有問題,直到我決定旋轉設備。更準確地說,只要我不決定更新我的文章片段,旋轉設備也會起作用。

我明白(糾正我,如果我錯了),Android在旋轉設備時自行處理碎片狀態。這似乎是一切正常,直到我想重新加載/更新其內容。好吧,讓我們深入瞭解一下。 第一次啓動時,我收到了一些空的主容器。然後我第一次加載我的文章片段。只需獲取SupportFragmentAdapter,創建我的ArticleFragment並用新創建的片段替換主容器 - 標記。沒有火箭科學 - 只是一個簡單的事務:

ViewPagerFragment pagerFragment = (ViewPagerFragment) 
    getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT_ARTICLE); 

if(pagerFragment != null){ 
    if(pagerFragment.isResumed()){ 
     pagerFragment.triggerReload(); 
    } 
} else { 
    pagerFragment = new ViewPagerFragment(); 
    FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
    t.replace(R.id.id_main_root_frame, pagerFragment, TAG_FRAGMENT_ARTICLE); 
    t.commitAllowingStateLoss(); 
} 

避免每次我重裝我的內容時創建一個片段,我想在交易之前並獲取片段 - 如果它是發現和恢復 - 觸發一些重新加載現有片段。

現在我旋轉我的設備在這種狀態。爲了避免與片段狀態混亂,我在片段內保留了onSaveInstanceState()。所以我猜這個片段只是被破壞並重新創建。一切仍然有效。但我認爲這部分有一些黑盒子。

之後 - 正常啓動,創建片段並放入主容器,旋轉設備 - 我觸發一些更新。但是不是通過標籤找到舊的(重新創建的)片段,而是找到未找到的並且創建並插入新的片段。至少試圖插入,因爲這是我得到了以下異常:

java.lang.IllegalStateException: Activity has been destroyed 

準確地說,我得到了上面的異常時,完成我的交易有commitAllowingStateLoss()。當我剛剛提交()的交易,我得到以下異常:

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

所以這就是錯誤出現。經過多年的調試和搜索,我在this question/answer上發現了一些提示,讓我的MainActivity的WeakReference獲得SupportFragmentManager。我該怎麼說。自從我實現了它,它就起作用了。我不得不改變我的更新過程,但它有效。但留下一些問題...

行爲似乎是相似的。第一次創作完美。重新加載相同 - 片段是通過標籤找到的。旋轉後,文章仍然顯示。當我用這個狀態重新加載片段時,它不會被標籤找到,所以創建一個新的片段,但是commit() - 請求不會引發異常。調試器裏面的內容顯示WeakReference是其他實例(其他實例),比所有這些都發生在其中。那就是我失去了陰謀的地方。 ..

如果你們中有些人可以給我一些提示,那會很棒! 在此先感謝!

+0

我有相同的問題,並沒有絲毫的線索,爲什麼它是表現這種方式。超級沮喪,因爲這些東西都沒有記錄。 – dcow 2013-08-26 21:23:57

回答

0

試試這個:

commitAllowingStateLoss(); instead commit();