Kotlin Android扩展导入未生效:View ID直接从R.id导入问题求助
解决Kotlin合成布局导入失效,需手动从R.id导入View的问题
我之前在用Android Feature模块开发时也碰到过一模一样的问题,结合你的配置(Kotlin 1.2.40 + com.android.feature插件),问题根源大概率在插件配置和合成布局的启用逻辑上,给你整理了一步步排查和解决的方案:
1. 补全Kotlin Android Extensions插件配置
你当前的Gradle里只应用了kotlin-android插件,但Kotlin合成布局(也就是后来View Binding的前身)需要额外启用kotlin-android-extensions插件。在模块的build.gradle里加上:
apply plugin: 'kotlin-android-extensions'
而且在1.2.x版本的Kotlin中,针对Feature模块的合成布局支持是实验性的,必须手动开启,所以还要添加这个配置块:
androidExtensions { experimental = true }
2. 核对布局文件名与导入路径
- 确保导入语句里的布局名和你实际使用的布局文件完全一致,比如布局是
fragment_user.xml,那导入应该是import kotlinx.android.synthetic.main.fragment_user.*,别写错字或者漏后缀。 - 如果是在ViewHolder里使用,要确认导入的是ViewHolder绑定的那套布局,并且把导入语句放在ViewHolder类的顶部。
3. 清理缓存并重建项目
Kotlin合成布局的代码是编译时自动生成的,有时候缓存会导致生成的代码不生效,按这个顺序操作:
- 点击Android Studio顶部的
Build→Clean Project - 接着点击
Build→Rebuild Project - 必要时重启Android Studio,彻底清除缓存
4. 尝试升级Kotlin插件版本
你的Kotlin版本是1.2.40,这个版本比较老旧,和com.android.feature插件的兼容性存在一些小问题。如果上面的步骤都没解决,可以尝试升级到1.3.x的稳定版本(比如1.3.72),修改根项目build.gradle里的依赖:
buildscript { dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72' } }
同步Gradle后重新编译项目。
5. 确认View的访问时机和方式
- 在Fragment中,一定要在
onViewCreated生命周期之后再访问合成的View,这时候布局才完全Inflate完成。 - 在ViewHolder里,要确保通过
itemView关联布局后再访问,或者直接导入对应布局的合成包直接用,比如:
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 直接用合成的View变量 fun bind(data: String) { itemView.title_text.text = data } }
按上面的步骤逐一排查,应该就能解决合成布局导入失效、只能从R.id导入的问题了。
内容的提问来源于stack exchange,提问作者Devganiya Hitesh
相关产品推荐
相关产品推荐

