android在提交事务后立即调用findFragmentByTag
用另一个片段替换片段的常见做法是:android在提交事务后立即调用findFragmentByTag,android,android-fragments,fragmenttransaction,Android,Android Fragments,Fragmenttransaction,用另一个片段替换片段的常见做法是: getActivity().getSupportFragmentManager() .beginTransaction() .setReorderingAllowed(true) .replace(R.id.fragment_holder, ItemFragment.newInstance(bundle),"tag") .addToBackStack(null) .commit(); commit()方法的文档说明: 安排此事务的提交提交
getActivity().getSupportFragmentManager()
.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.fragment_holder, ItemFragment.newInstance(bundle),"tag")
.addToBackStack(null)
.commit();
commit()
方法的文档说明:
安排此事务的提交提交不会立即发生;它将被安排为下一次线程准备就绪时在主线程上完成的工作
现在假设我调用
getActivity.getSupportFragmentManager.findFragmentByTag(“tag”)代码>就在上面提到的提交方法之后。由于提交不会立即发生,它是否可能返回null?我想说这是可能的,但是我觉得这里真正的问题是您使用的设计。如果片段A需要引入/替换片段B,那么正确的设计是让活动处理片段管理。片段不应直接添加/替换其他片段
如果这些都是在活动中处理的,您可以轻松地保留对新片段的引用,这意味着您不需要查找FragmentByTag(“标记”),因为您在创建/替换时已经有了对它的引用
Activity
/ \
Fragment A Fragment B
片段A和片段B不应直接相互影响
// In Activity ...
public replaceFragment() {
Fragment fragmentB = ItemFragment.newInstance(bundle);
getSupportFragmentManager()
.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.fragment_holder, fragmentB, "tag")
.addToBackStack(null)
.commit();
// You now have fragmentB no need to getSupportFragmentManager.findFragmentByTag("tag")
fragmentB.doSomething();
如果findFragmentByTag(“tag”)
会声明这种情况,我认为它不会返回null
另外,该方法来自FragmentManager
类,因此它只关心片段管理器中是否包含commit()
函数来自FragmentTransaction
a类片段即使未提交也可以在片段管理器的后堆栈中,因此,函数findFragmentByTag(“tag”)
将返回片段,并且仅当带有该标记的片段从未添加到片段管理器时才会返回null
getSupportFragmentManager()
.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.fragment_holder, fragmentB, "tag")
.addToBackStack(null)
上面的代码将片段添加到宿主活动的片段管理器的后堆栈中。您可以这样做,并在片段管理器中找到此片段,不需要提交。当然,我可以保留对新创建片段的引用,但我希望避免它。片段已经由系统管理和保存(SupportFragmentManager),因此对它们进行强引用是浪费内存。更新:我测试了越来越多的片段,最终可能会遇到nullPointerException
。所以我的问题的简单答案是:是的,这是可能的!