9

如果用戶沒有數據,則顯示空片段。在那個emptyFragment(在onViewCreated)我檢查一個條件,有時想用另一個替換那個空的Fragment,所以我調用了一個替換片段的相應活動的方法。onViewCreated - 錯誤的地方來替換片段?

一些用戶(目前只有三星,6.0.1但我不知道這意味着什麼)體驗上線崩潰,我executePendingTransactions

IllegalStateException: 

Fatal Exception: java.lang.RuntimeException 
Unable to resume activity 
{....app.activities.MyActivity_}: 
java.lang.IllegalStateException: FragmentManager is already executing transactions 

這是在6.0.1中的錯誤或者是onViewCreated做錯了這個地方?

編輯

這將是一個可能的解決方案?

if (addToBackStack) { 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).addToBackStack(name).commitAllowingStateLoss(); 
     getSupportFragmentManager().executePendingTransactions(); 
    } else { 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).commitNow(); 
    } 

回答

0

嘗試FragmentTransaction.commitNow();如果你正在處理的,而不是使用commit()

對於舊版本的SDK具有24:FragmentManager.executePendingTransactions()commit()通話

+0

我AM首先使用'executePendingTransactions()' – swalkner

4

首先後:你爲什麼不動您的活動中的「檢查條件」?通過這種方式,您可以決定您需要的片段是什麼:管理空值或另一個片段的片段。

第二:我建議閱讀關於片段commitstate loss的兩個小教程。您可以在那裏找到許多與片段相關的錯誤條件。

最後,與'FragmentManager正在執行事務'有關的答案:至少有兩個對executePendingTransactions()方法的嵌套調用,這意味着您要求片段管理器(有一個片段管理器的單個實例每個Activity)在執行另一個事務時執行一個事務。很難確定問題在哪裏,你應該發佈活動的所有代碼和所有涉及的碎片,只是爲了識別和刪除一個(第一個)調用executePendingTransactions,但我可以給你一些提示:

  1. 請勿使用executePendingTransactions()。如果您不需要立即訪問要添加到活動中的片段,則很難獲得需要在片段之間進行編排的代碼
  2. 使用commit()。只要主線程空閒,簡單的提交將立即執行所有事務。
  3. 如果您需要立即訪問片段,請使用commitNow()。老實說,我只用了幾次這個方法,主要是爲了正確處理DialogFragments。

commitNow()可用於前24個設備,如果您使用support library,我建議您採用。

+0

:因爲首先我展示一個無數據片段,然後,當網絡調用返回時,我想用另一個替換它... – swalkner

+0

您是否嘗試刪除executePendingTransaction? –

+0

喜歡在我的編輯? – swalkner