Kotlin中LayoutInflater传参与跨布局findViewById问题
解答
LayoutInflater.from() 参数要求
LayoutInflater.from() 必须传入一个有效的Context实例作为参数,你当前处于Activity场景下,不需要依赖parent获取context,直接传入当前Activity实例(即this)即可,Activity本身就是Context的子类,符合参数要求。
补全后的代码如下:
val newView = LayoutInflater.from(this).inflate(R.layout.fragment_home, null)
你当前已经在使用ViewBinding完成setContentView逻辑,Activity本身已经对外暴露了可用的layoutInflater属性,不需要额外调用LayoutInflater.from()传参,直接使用该属性即可简化代码:
val newView = layoutInflater.inflate(R.layout.fragment_home, null)
注意:不建议inflate时将第二个参数传为null,该写法会导致加载布局的根节点
layout_*系列布局参数失效。如果后续需要将inflate得到的View添加到现有容器中,建议将目标容器作为第二个参数传入,第三个参数传false(表示暂不将加载的View附加到容器上),系统会自动按照容器的规则生成正确的布局参数。
其他访问其他布局控件的方案
除了手动inflate后调用findViewById,还有以下更规范的实现方式:
- 使用对应布局的ViewBinding实例
开启ViewBinding后,每个布局文件会自动生成对应的Binding类,无需手动写findViewById逻辑,直接调用对应Binding的inflate方法即可拿到所有控件的引用:// 加载fragment_home布局,自动生成控件引用 val homeBinding = FragmentHomeBinding.inflate(layoutInflater) // 直接通过binding对象访问控件 homeBinding.tvHomeTitle.text = "无需findViewById直接访问" // 需要添加布局时直接取homeBinding.root即可 - 如果目标布局是Fragment、Dialog、自定义View的对应布局,不要在Activity中手动inflate加载,优先通过对应组件自身的生命周期方法加载布局,通过组件持有的binding或view对象访问控件,避免内存泄漏和生命周期不一致问题。
- 不推荐使用已废弃的Kotlin Android Extensions(即kotlin-synthetics)访问其他布局控件,该插件已被官方正式移除,存在大量边界问题和性能隐患。
内容的提问来源于stack exchange,提问作者Krix
相关产品推荐
相关产品推荐

