ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

10行代码告别findViewById:Kotter Knife自定义View绑定实战

10行代码告别findViewById:Kotter Knife自定义View绑定实战 10行代码告别findViewByIdKotter Knife自定义View绑定实战【免费下载链接】kotterknifeView injection library for Android.项目地址: https://gitcode.com/gh_mirrors/ko/kotterknife在 Android 开发中findViewById几乎每个页面都要写一遍重复、冗长还容易出错。Kotter Knife 是一款专为 Kotlin 设计的 Android View 绑定injection库借助 Kotlin 的属性委托property delegate机制让你用一个简洁的by bindView(...)语句替代所有 findViewById 调用。本文带你了解 Kotter Knife 的核心玩法10 行代码搞定一个自定义 View 的控件绑定。Kotter Knife 是什么Kotter Knife 的定位可以用一句话概括Butter Knife 风格的 View 绑定但为 Kotlin 而生。它不需要注解处理器也不用写BindView这类注解——Kotlin 的属性委托本身就完成了绑定声明的工作。它的核心实现就一个文件ButterKnife.kt整个库的代码量极小这也是它易于理解、易于内化的原因。 提示项目官方在 README.md 中已将其标记为 Deprecated作者建议使用 Android 官方 View Binding。但作为理解Kotlin 属性委托 属性注入这一设计思想的经典案例Kotter Knife 依然值得学习它的思路完全可以迁移到自己的项目里。快速获取库Kotter Knife 目前不发布到 Maven Central提供两种使用方式引用 SNAPSHOT 包在 Gradle 中添加compile com.jakewharton:kotterknife:0.1.0-SNAPSHOT直接拷贝源码把 src/main/kotlin/kotterknife/ButterKnife.kt 复制到你的工程源码目录。该文件依赖support-v4和recyclerview-v7如果不需要 Fragment 和 RecyclerView 的支持删掉对应几行即可。10 行代码绑定一个自定义 View先看一个典型的实战场景你正在开发一个展示人物信息的自定义控件。传统写法需要findViewById 强转而用 Kotter Knife 只需声明式绑定class PersonView(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) { val firstName: TextView by bindView(R.id.first_name) val lastName: TextView by bindView(R.id.last_name) // 可选绑定控件可能不存在 val details: TextView? by bindOptionalView(R.id.details) // 列表绑定一次拿到多个同类控件 val nameViews: ListTextView by bindViews(R.id.first_name, R.id.last_name) }对比一下传统写法区别一目了然// 传统方式每个控件都要 findViewById 强转 val firstName findViewByIdTextView(R.id.first_name) val lastName findViewByIdTextView(R.id.last_name)没有强转、没有重复的 findViewById、类型全部由编译器保证这就是10 行代码告别 findViewById的含义。4 个绑定 API 一览Kotter Knife 提供了 4 类 API覆盖了日常绑定的几乎所有场景API返回值适用场景bindView(id)V非空控件必定存在bindOptionalView(id)V?可空控件可能不存在bindViews(ids...)ListV一次绑定多个控件缺失则抛异常bindOptionalViews(ids...)ListV一次绑定多个控件缺失的自动跳过这 4 个方法都以扩展函数的形式定义在 ButterKnife.kt 中并且分别提供了View、Activity、Dialog、Fragment、ViewHolder等多个接收者版本例如public fun V : View ViewHolder.bindView(id: Int) : ReadOnlyPropertyViewHolder, V required(id, viewFinder)这意味着Activity、Dialog、Fragment含 support 版本、RecyclerView.ViewHolder、以及任何 ViewGroup 子类都能直接使用绑定语法。原理解读Kotlin 属性委托的魅力Kotter Knife 的精髓在于对 Kotlin 属性委托的运用。每个绑定声明返回的其实是一个ReadOnlyProperty// Like Kotlins lazy delegate but the initializer gets the target and metadata passed to it private class LazyT, V(private val initializer: (T, KProperty*) - V) : ReadOnlyPropertyT, V { private object EMPTY private var value: Any? EMPTY override fun getValue(thisRef: T, property: KProperty*): V { if (value EMPTY) { value initializer(thisRef, property) } return value as V } }它的工作原理非常巧妙懒加载findViewById只在第一次访问属性时执行一次之后结果被缓存安全提示如果bindView找不到对应控件会抛出带属性名的清晰异常如View ID 1 for name not found.方便快速定位问题查找策略因宿主而异Fragment中优先从view里查找DialogFragment会先查dialog再查viewViewHolder则从itemView查找这些行为在官方测试类 ViewTest.kt 中有完整验证包括类型转换、结果缓存、缺失控件报错、可选绑定与列表绑定等场景是理解其行为的最佳参考。实际项目中的使用建议自定义 View 是最佳场景在继承ViewGroup的控件里声明绑定属性业务逻辑代码会干净很多ViewHolder 里同样适用列表项的控件绑定不再需要每次onBindViewHolder里反复查找注意项目状态Kotter Knife 已弃用且版本停留在 0.1.0-SNAPSHOT见 gradle.properties新生产项目建议直接使用 Android 官方 View Binding而把 Kotter Knife 当作学习 Kotlin 属性委托 属性注入设计的范本则非常合适依赖可裁剪直接拷贝源码方式下不需要的扩展函数如 support Fragment 版本可以随意删除做到按需取用总结Kotter Knife 用不到几百行代码演示了一个优雅的设计把查找控件这件事从命令式代码变成声明式属性。虽然项目已归档但它展示的 Kotlin 属性委托思想——用by关键字把重复逻辑封装进委托对象——至今仍是编写高质量 Android 代码的核心技能。学会这一招无论将来用 View Binding 还是自己写注入库你都能如鱼得水。项目基于 Apache 2.0 协议开源详见 LICENSE.txt。【免费下载链接】kotterknifeView injection library for Android.项目地址: https://gitcode.com/gh_mirrors/ko/kotterknife创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表