当前位置: 首页 > web >正文

升级目标API级别到35,以Android15为目标平台(三 View绑定篇)

目录

    • 🎯 什么是 kotlin-android-extensions
      • 基本概念
      • 主要功能
    • 🔧 kotlin-android-extensions 的工作原理
      • 编译时处理
      • 生成的代码示例
    • ⚙️ 如何集成 kotlin-android-extensions
      • 重要提示
      • 版本要求
      • 1. 在项目级 build.gradle 中配置
      • 2. 在模块级 build.gradle 中启用插件
      • 3. 配置实验性功能(可选)
      • 4. 兼容性说明
      • 5. 替代方案
    • 📖 kotlin-android-extensions 的使用方法
      • 1. 基本用法
      • 2. 导入特定 View
      • 3. 在 Fragment 中使用
      • 4. 在 RecyclerView.ViewHolder 中使用
      • 5. 在自定义 View 中使用
    • ✅ kotlin-android-extensions 的优缺点
      • 优点
      • 缺点
    • ⚠️ 为什么需要迁移
      • 官方废弃声明
      • 技术债务
      • 现代化需求
    • 🚀 迁移到 View Binding
      • View Binding 的优势
      • 启用 View Binding
      • 基本用法对比
      • View Binding 初始化方式对比
      • 最佳实践建议
    • 📋 迁移策略和步骤
      • 第一阶段:环境准备
      • 第二阶段:代码迁移
    • 🔧 常见问题和解决方案
      • 问题1:编译错误
      • 问题2:View 找不到
      • 问题3:性能问题
      • 问题4:版本兼容性
    • 📚 参考资料
      • 官方文档
      • 社区资源
      • 工具和脚本
    • 📝 总结
    • 🎯 kotlin-android-extensions 的完整功能范围
      • 主要功能组成
      • 迁移影响
      • 迁移建议
    • 🔄 @Parcelize 注解的迁移方案
      • @Parcelize 简介
      • 当前项目使用情况
      • 迁移方案
        • 方案一:使用独立的 kotlin-parcelize 插件(推荐)
        • 方案二:手动实现 Parcelable(不推荐)
      • 迁移步骤
      • 混淆配置
      • 常见问题
      • 迁移验证
    • 🛠️ Gradle 构建问题及解决方案
      • MissingMethodException 错误
      • 解决方案
      • 版本兼容性表
      • 版本配置位置说明
        • 1. Kotlin 版本配置
        • 2. AGP(Android Gradle Plugin)版本配置
        • 3. Gradle 版本配置
      • 版本更新建议
      • 常见问题解决
      • 特殊说明:
      • 其他可能的解决方案
      • 注意事项
    • 📦 LayoutContainer 实现原理及替代方案
      • LayoutContainer 简介
      • 原始实现方式
      • 实现原理
      • 替代方案
      • 迁移建议
      • 注意事项
    • 🔧 Kotlin Gradle Plugin 说明
      • 插件介绍
      • 主要功能
      • 配置方式
      • 相关插件说明
      • 版本选择
      • 最佳实践
      • 注意事项
    • �� View Binding 版本信息及 Android 15 兼容性
      • 当前项目配置
        • 1. Android Gradle Plugin 版本
        • 2. Gradle 版本
        • 3. 编译配置
        • 4. View Binding 状态
      • View Binding 版本信息
        • 1. View Binding 版本说明
        • 2. 版本对应关系
      • Android 15 兼容性分析
        • 1. Android 15 基本信息
        • 2. 当前项目兼容性
        • 3. 升级建议
      • View Binding 启用步骤
        • 1. 启用 View Binding
        • 2. 验证启用
        • 3. 检查生成的绑定类
      • 性能对比
        • 1. View Binding vs findViewById
        • 2. View Binding vs Data Binding
      • 最佳实践建议
        • 1. 版本选择
        • 2. 迁移策略
        • 3. 性能优化
      • 总结
    • View Binding 使用方式总结
      • �� 概述
      • �� View Binding 初始化方式详解
        • 1. **inflate() 方式(直接加载布局)**
          • 1.1 标准 Activity 使用
          • 1.2 使用 by lazy(推荐)
        • 2. **bind() 方式(绑定已存在的 View)**
          • 2.1 基类已处理布局的情况
        • 3. **混合绑定方式(处理 include 布局)**
          • 3.1 主布局 + include 布局
        • 4. **基类特定方式**
          • 4.1 SimpleActivity 子类
          • 4.2 YishouActivity 子类
      • 📊 各种方式对比
      • 🎯 最佳实践建议
        • 1. **选择合适的方式**
        • 2. **命名规范**
        • 3. **内存管理**
        • 4. **错误处理**
      • �� 实际项目应用
        • 已迁移的文件示例
      • 🔍 常见问题
        • Q1: 为什么 `ActivityVideoNew2Binding` 能找到 `activity_video_new2.xml`?
        • Q2: 什么时候使用 `bind()` 而不是 `inflate()`?
        • Q3: 如何处理 include 布局中的控件?
        • Q4: 为什么 SimpleActivity 子类不要调用 `setContentView(binding.root)`?


🎯 什么是 kotlin-android-extensions

基本概念

kotlin-android-extensions 是 Kotlin 官方提供的一个 Android 插件,它允许开发者通过 kotlinx.android.synthetic 包直接访问 XML 布局文件中定义的 View,而无需使用 findViewById() 方法。

主要功能

  • 自动生成 View 绑定代码:根据 XML 布局文件自动生成对应的 View 引用
  • 类型安全:编译时检查 View 类型,避免运行时类型转换错误
  • 简化代码:减少样板代码,提高开发效率

🔧 kotlin-android-extensions 的工作原理

编译时处理

  1. 插件扫描:在编译时扫描 XML 布局文件
  2. 代码生成:为每个布局文件生成对应的 synthetic 导入
  3. 字节码注入:将生成的代码注入到 Kotlin 类中

生成的代码示例

// 原始代码
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 直接使用 View,无需 findViewByIdtextView.text = "Hello World"button.setOnClickListener { /* ... */ }}
}

编译后生成的代码

// 编译器自动生成的代码
class MainActivity : AppCompatActivity() {private var _$_findViewCache: Map<Int, View>? = nullprivate fun _$_findCachedViewById(id: Int): View? {if (_$_findViewCache == null) {_$_findViewCache = HashMap()}var view = _$_findViewCache!![id]if (view == null) {view = findViewById(id)_$_findViewCache!![id] = view}return view}// 为每个 View 生成属性val textView: TextViewget() = _$_findCachedViewById(R.id.textView) as TextViewval button: Buttonget() = _$_findCachedViewById(R.id.button) as Button
}

⚙️ 如何集成 kotlin-android-extensions

重要提示

⚠️ 从 Kotlin 1.4.20-M2 版本开始,kotlin-android-extensions 插件已被官方废弃。
如果您正在开始新项目,建议直接使用 View Binding。
以下内容仅供参考和维护旧项目使用。

版本要求

  • Kotlin 版本:< 1.8.0
  • Android Gradle Plugin 版本:≤ 4.2.2
  • Gradle 版本:≤ 6.7.1

1. 在项目级 build.gradle 中配置

buildscript {ext.kotlin_version = '1.7.10' // 必须使用 1.8.0 以下版本dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"// 不需要单独添加 kotlin-android-extensions,它包含在 kotlin-gradle-plugin 中}
}

2. 在模块级 build.gradle 中启用插件

// 旧版 Groovy DSL
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'// 或者使用新版 Kotlin DSL
plugins {id("kotlin-android")id("kotlin-android-extensions")
}

3. 配置实验性功能(可选)

如果需要使用 @Parcelize 等实验性功能:

androidExtensions {experimental = true
}

4. 兼容性说明

  1. 版本限制

    • 不支持 Kotlin 1.8.0 及以上版本
    • 不建议在新项目中使用
    • 与某些新版本的 Jetpack 库可能存在兼容性问题
  2. 跨模块限制

    • synthetic 导入在跨模块场景下无法工作
    • 存在一个自2018年1月就未解决的相关问题
  3. IDE支持

    • Android Studio 最新版本可能无法很好地支持此插件
    • 建议使用与项目 Kotlin 版本相匹配的 IDE 版本

5. 替代方案

如果您正在开始新项目,建议使用以下方案之一:

  1. View Binding(推荐)

    android {buildFeatures {viewBinding true}
    }
    
  2. 传统 findViewById

    private lateinit var textView: TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)textView = findViewById(R.id.textView)
    }
    

📖 kotlin-android-extensions 的使用方法

1. 基本用法

// 导入布局文件的所有 View
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 直接使用 ViewtitleTextView.text = "Welcome"loginButton.setOnClickListener {// 处理点击事件}}
}

2. 导入特定 View

// 只导入特定的 View
import kotlinx.android.synthetic.main.activity_main.titleTextView
import kotlinx.android.synthetic.main.activity_main.loginButtonclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)titleTextView.text = "Welcome"loginButton.setOnClickListener { /* ... */ }}
}

3. 在 Fragment 中使用

import kotlinx.android.synthetic.main.fragment_home.*class HomeFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_home, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 在 Fragment 中使用recyclerView.adapter = adapterswipeRefreshLayout.setOnRefreshListener { /* ... */ }}
}

4. 在 RecyclerView.ViewHolder 中使用

import kotlinx.android.synthetic.main.item_user.view.*class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {fun bind(user: User) {// 使用 itemView 前缀itemView.userNameTextView.text = user.nameitemView.userAvatarImageView.load(user.avatarUrl)}
}

5. 在自定义 View 中使用

import kotlinx.android.synthetic.main.custom_view.view.*class CustomView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {init {inflate(context, R.layout.custom_view, this)// 直接使用 ViewtitleText.text = "Custom Title"actionButton.setOnClickListener { /* ... */ }}
}

✅ kotlin-android-extensions 的优缺点

优点

  1. 简化代码:无需手动调用 findViewById()
  2. 类型安全:编译时检查 View 类型
  3. 性能优化:使用缓存机制,避免重复查找
  4. 开发效率:减少样板代码,提高开发速度
  5. IDE 支持:自动补全和重构支持

缺点

  1. 全局导入:可能导致命名冲突
  2. 编译时依赖:增加编译时间
  3. 调试困难:生成的代码难以调试
  4. 版本兼容性:与某些库可能存在兼容性问题
  5. 废弃风险:已被官方废弃,不再维护

⚠️ 为什么需要迁移

官方废弃声明

  • 废弃时间:2020年10月
  • 废弃原因:View Binding 提供了更好的替代方案
  • 维护状态:不再接收新功能和 bug 修复

技术债务

  1. 安全风险:使用废弃的插件存在安全风险
  2. 兼容性问题:与新版本 Android Gradle Plugin 可能存在兼容性问题
  3. 性能影响:可能影响编译性能和运行时性能

现代化需求

  1. View Binding:官方推荐的现代化解决方案
  2. 类型安全:提供更好的类型安全保证
  3. 空安全:支持 Kotlin 空安全特性

🚀 迁移到 View Binding

View Binding 的优势

  1. 官方支持:Google 官方推荐
  2. 类型安全:编译时类型检查
  3. 空安全:支持 Kotlin 空安全
  4. 性能优化:编译时生成代码,运行时性能更好
  5. IDE 支持:更好的 IDE 支持

启用 View Binding

android {buildFeatures {viewBinding true}
}

基本用法对比

使用 kotlin-android-extensions

import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity(
http://www.xdnf.cn/news/16400.html

相关文章:

  • 上位机程序开发基础介绍
  • Round-Robin仲裁器
  • 深入理解 BIO、NIO、AIO
  • RocketMQ学习系列之——客户端消息确认机制
  • jwt 在net9.0中做身份认证
  • [2025CVPR-图象分类方向]CATANet:用于轻量级图像超分辨率的高效内容感知标记聚合
  • C# WPF 实现读取文件夹中的PDF并显示其页数
  • 案例分享|告别传统PDA+便携打印机模式,快速实现高效率贴标
  • Class18卷积层的填充和步幅
  • uniapp之微信小程序标题对其右上角按钮胶囊
  • 测试ppyoloe的小样本few-shot能力,10张图片精度达到69.8%
  • Allegro软件光绘文件Artwork到底如何配置?
  • Python柱状图
  • Lakehouse x AI ,打造智能 BI 新体验
  • 戴尔电脑 Linux 安装与配置指南_导入mysql共享文件夹
  • 关于网络模型
  • FreeRTOS—优先级翻转问题
  • vue项目入门
  • 【C++避坑指南】vector迭代器失效的八大场景与解决方案
  • haproxy七层代理(原理)
  • 从0开始学习R语言--Day57--SCAD模型
  • 深入浅出设计模式——创建型模式之简单工厂模式
  • Hive【Hive架构及工作原理】
  • 如何高效通过3GPP官网查找资料
  • JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发
  • 服务器托管:网站经常被攻击该怎么办?
  • 学习游戏制作记录(克隆技能)7.25
  • 秋招Day19 - 分布式 - 分布式锁
  • 初识决策树-理论部分
  • 肺癌预测模型实战案例