Android开发:提交Fragment替换事务后立即调用findFragmentByTag是否可能返回null?
问题:调用FragmentTransaction.commit()后立即调用findFragmentByTag会返回null吗?
是的,这种情况下绝对有可能返回null,核心原因就是你引用的commit()方法的官方说明:
安排此事务的提交。提交不会立即执行;它会被安排为主线程的工作,待该线程下次就绪时执行。
简单来说,commit()只是把Fragment替换的任务"预约"到了主线程的任务队列里,并没有立刻执行。当你在调用commit()之后马上调用getActivity().getSupportFragmentManager().findFragmentByTag("tag")时,当前的代码逻辑还在主线程里同步执行,FragmentManager还没来得及处理刚才预约的事务,自然找不到对应的Fragment实例,返回null就是意料之中的事。
举个实际的例子:假设你在一个按钮的点击回调里执行这段代码:
// 提交Fragment替换事务 getActivity().getSupportFragmentManager() .beginTransaction() .setReorderingAllowed(true) .replace(R.id.fragment_holder, ItemFragment.newInstance(bundle),"tag") .addToBackStack(null) .commit(); // 立刻查找Fragment Fragment fragment = getActivity().getSupportFragmentManager().findFragmentByTag("tag"); // 这里fragment很可能是null
此时主线程还在处理点击回调的代码,还没轮到执行Fragment事务,所以查找结果为空。
如果需要确保能获取到这个Fragment,可以参考两种方案:
- 使用
commitNow()替代commit():这个方法会同步立即执行事务,但要注意它不能与addToBackStack()配合使用,而且在主线程处于某些状态(比如正在执行动画)时可能会抛出异常。 - 监听Fragment生命周期:在
ItemFragment的onViewCreated()或onResume()等生命周期方法中,通知宿主组件Fragment已就绪,这时再去查找就能得到非null的实例。
内容的提问来源于stack exchange,提问作者Soheil
相关产品推荐
相关产品推荐

