2014-04-11 46 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