将数据绑定实现从kotlin-android-extensions迁移至kotlin-kapt方案咨询
Kotlin Android Extensions 迁移至Data Binding 实操指南
kotlin-android-extensions(Kotlin synthetics)从Kotlin 1.4.20版本开始正式废弃,官方推荐的替代方案为View Binding与Data Binding,以下为迁移至Data Binding的完整操作步骤:
1. 开启Data Binding构建配置
在模块级build.gradle(或build.gradle.kts)中添加配置,同时移除旧的kotlin-android-extensions插件引用:
Groovy 版本配置
plugins { // 删掉原有这行:id 'kotlin-android-extensions' id 'com.android.application' id 'kotlin-android' } android { ... buildFeatures { // 开启Data Binding dataBinding true } }
Kotlin DSL 版本配置
plugins { // 删掉原有这行:kotlin("android.extensions") id("com.android.application") id("org.jetbrains.kotlin.android") } android { ... buildFeatures { dataBinding = true } }
配置完成后同步Gradle即可。
2. 改造布局文件
所有用到控件引用的布局都需要将原根节点包裹在<layout>标签中,示例如下:
<!-- 改造前 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <!-- 改造后 --> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </layout>
改造后构建项目,系统会自动生成对应绑定类,命名规则为布局文件名转驼峰加Binding后缀,例如activity_main.xml对应生成ActivityMainBinding类。
3. 替换代码中的synthetics引用
Activity 场景
// 改造前 import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tv_user_name.text = "张三" } } // 改造后 class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 控件名下划线自动转驼峰 binding.tvUserName.text = "张三" } }
Fragment 场景
// 改造前 import kotlinx.android.synthetic.main.fragment_home.* class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) tv_content.text = "首页内容" } } // 改造后 class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentHomeBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.tvContent.text = "首页内容" } override fun onDestroyView() { super.onDestroyView() // 销毁绑定避免内存泄漏 _binding = null } }
4. 额外功能兼容:Parcelize 注解迁移
如果你之前用到了kotlin-android-extensions提供的@Parcelize注解实现Parcelable序列化,需要单独引入kotlin-parcelize插件,原有注解用法不变:
- Groovy 配置添加:
id 'kotlin-parcelize' - Kotlin DSL 配置添加:
kotlin("parcelize")
完成以上步骤后,清理所有kotlinx.android.synthetic相关的导入语句,重新构建项目即可完成全部迁移。
内容的提问来源于stack exchange,提问作者SkorpEN
相关产品推荐
相关产品推荐

