2014-04-11 49 views
0

我有一些簡單的代碼,我用另一個片段替換一個片段。我看到的問題是,新的片段從來沒有任何創建/附加等生命週期稱爲。executePendingTransactions不承諾FragmentTransaction

的代碼如下:

String SERVER="SERVER"; 
android.support.v4.app.FragmentManager fm = getChildFragmentManager();  
FragmentTransaction ft = fm.beginTransaction().setCustomAnimations(R.anim.pop_enter, R.anim.pop_exit); 


Fragment s = fm.findFragmentByTag(SERVER); 
if(s == null) s = new ServerFragment(); 

ft.replace(R.id.fragment_container, s, SERVER); 
ft.show(s); 
ft.commit(); 
boolean result = fm.executePendingTransactions(); 
//Validate if added 
Fragment frag = fm.findFragmentByTag(SERVER); 
frag.isAdded(); //Returns FALSE! 

我期望isAdded方法返回true和批判我也期望要調用常用的片段生命週期方法。但是,情況並非如此。

任何想法將不勝感激?

問候

+0

這些解決方案都沒有工作,有什麼進一步的思想? – user3521637

回答

0

這裏不是正面的,但好像因爲你正在創建一個新的片段,每次不明確摧毀舊ServerFragments,很可能是findFragmentByTag是找到創建的第一個片段,這將不會返回因爲它已從視圖層次結構中移除,所以對於isAdded()爲true。

如果這是正確的,那麼你應該看到isAdded()調用返回真正的第一次調用該方法,之後

+0

感謝您的及時回覆。這可能是合理的,實際上我發現以上是在ceratain情況下工作,而不是在其他情況下工作。我寫了幾個測試用例,在第二個測試用例中它失敗了。所以你第一次工作的觀點是有道理的。我會試着明確摧毀(必須弄清楚如何?)並讓你知道它是如何發生的。 – user3521637

+0

事實上,我檢查了我的代碼,它有一個警衛來檢查片段是否已經存在。只有它不存在,它纔會創建一個新的片段。如果之前刪除了一個片段,它會自動銷燬? – user3521637

+0

我以爲remove()只是將它從容器中移除,所以如果你已經在某處使用了findFragmentByTag()並保存了Fragment對象,那麼它仍然會在.. 也許當你檢查s == null時,你可以當s!= null(或while())時,它就會被銷燬 – dangVarmit

0

我相信這是執行掛起的事務具有的功能不再字立即在它。它使交易立即發生,而不是在程序到達時發生。

+0

找不到這樣的函數,docs暗示executePendingTransactions確實精確地描述了它,而不是提交哪個隊列。 – user3521637

+0

道歉。誤讀該功能。你有正確的。 – AdamM