如何解决Android Safe Args传参后目标Fragment不显示的问题?
核心故障点
定位到目标接收Fragment的onCreateView实现,存在视图返回逻辑错误:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 基于布局创建DataBinding实例,同时获取到绑定关系下的所有控件 val binding: FragmentEntryBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_entry, container, false) // 给绑定实例上的控件设置传递过来的参数 binding.title.text = args.title binding.date.text = args.date binding.body.text = args.body // 错误逻辑:重新inflate了一次全新的布局实例并作为返回值 // 这个新实例和之前设置过文本的绑定视图无任何关联,控件都是默认空状态 return inflater.inflate(R.layout.fragment_entry, container, false) }
- 这是导致页面参数完全不显示的直接原因:系统最终渲染的是
return语句返回的全新布局对象,你之前给binding控件设置的文本完全作用在另一个内存中的视图实例上,不会展示在屏幕上。 - 修复方式:将返回值替换为
return binding.root,直接返回DataBinding创建的、已经完成参数赋值的视图根节点。
配套校验项
- 确认项目已正确配置Safe Args插件:检查模块级gradle依赖中是否引入了navigation-safe-args-gradle-plugin,完成项目同步后再重新运行,避免生成的Directions、Args类参数映射错位。
- 确认导航图中argument配置和传参顺序一致:当前导航XML中
entryFragment配置的三个string类型参数,和Adapter中传参的顺序、类型完全匹配,无类型不兼容问题。 - 确认未手动清空Fragment的arguments:避免在导航跳转后通过代码手动调用
fragment.arguments = null,导致navArgs()委托获取到空参数。
内容的提问来源于stack exchange,提问作者Jordan Kellogg
相关产品推荐
相关产品推荐

