# Local_Binding **Repository Path**: lv003s0/Local_Binding ## Basic Information - **Project Name**: Local_Binding - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-21 - **Last Updated**: 2021-10-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #

Binding

一行代码实现 DataBinding 和 ViewBinding,欢迎 star

如果图片无法查看,请点击这里查看 图例1 | 图例2

## 关于 Binding Binding 简化 DataBinding 和 ViewBinding 的使用, 只需要一行代码即可实现 DataBinding 和 ViewBinding。 Binding 未来的规划提供通用的 `findViewById` 解决方案,,因技术的迭代更新从 butterknife 、 DataBinding 、 Kotlin 合成方法(Synthetic 视图)到现在 ViewBinding , 未来也有可能出现新的技术,无论技术怎么变化,只需要更新 Binding ,对外的使用保持不变。 Kotlin 合成方法(Synthetic 视图)比 ViewBinding 方便这么多,为什么会被 Google 抛弃掉,请查看这篇文章 [Kotlin 插件的落幕,ViewBinding 的崛起](https://mp.weixin.qq.com/s/FxrRyXp9-VDdv-mfkzsIsA)。 感谢小伙伴们的建议,目前 Binding 已经适配了大量的场景,同时也提供了很多 DataBinding 和 ViewBinding 实战案例,如果你在使用过程中遇到 Binding 不兼容的场景,欢迎提 issue,我会尽快解决 **如果这个仓库对你有帮助,请在仓库右上角帮我 star 一下,非常感谢你的支持,同时也欢迎你提交 PR** ❤️❤️❤️ **[Binding](https://github.com/hi-dhl/Binding) 具有以下优点:** * 简单的 API 只需要一行代码即可实现 DataBinding 或者 ViewBinding * 支持在 `Activity` 、`AppCompatActivity` 、`FragmentActivity` 、`Fragment` 、`Dialog` 中的使用 DataBinding 或者 ViewBinding * 支持在 `ListAdapter` 、 `PagingDataAdapter` 、 `RecyclerView.Adapter` 中的使用 DataBinding 或者 ViewBinding * 支持在 Navigaion Fragment 管理框架、 BottomSheetDialogFragment 等等场景中使用 DataBinding 和 ViewBinding * 避免大量的模板代码 * 避免内存泄露,具有生命周期感知能力,当生命周期处于 `onDestroyed()` 时会自动销毁数据 ## Download **Gradle** 将下列代码添加在模块级 `build.gradle` 文件中,并且需要开启 DataBinding 或者 ViewBinding ``` android { buildFeatures { dataBinding = true viewBinding = true } } dependencies { implementation 'com.hi-dhl:binding:1.0.5' } ``` ## Usage * 在 Adapter(ListAdapter、PagingDataAdapter、RecyclerView.Adapter 等等)中使用 DataBinding 和 ViewBinding,添加 `by viewbind()` 或者 `by databind()` 即可,示例如下所示,[查看详细示例](https://github.com/hi-dhl/Binding/blob/main/app/src/main/java/com/hi/dhl/demo/binding/databind/list/ProductAdapter.kt) ``` class ProductViewHolder(view: View) : RecyclerView.ViewHolder(view) { // 通过 DataBinding 绑定的 itemView val binding: RecycleItemProductBinding by databind() fun bindData(data: Product?, position: Int) { binding.apply { product = data executePendingBindings() } } } class ProductViewHolderHeader(view: View) : RecyclerView.ViewHolder(view) { // ViewBinding val binding: RecycleItemProductHeaderBinding by viewbind() fun bindData(data: Product?, position: Int) { binding.apply { name.text = "通过 ViewBinding 绑定的 head" } } } class ProductViewHolderFooter(view: View) : RecyclerView.ViewHolder(view) { // ViewBinding val binding: RecycleItemProductFooterBinding by viewbind() fun bindData(data: Product?, position: Int) { binding.apply { name.text = "通过 ViewBinding 绑定的 footer" } } } ``` * 在 `Activity` 、`AppCompatActivity` 、`FragmentActivity` 中使用,继承对应的类添加 `by viewbind()` 即可,示例如下所示。 ``` class MainActivity : AppCompatActivity() { // DataBinding val binding: ActivityMainBinding by databind(R.layout.activity_main) // ViewBinding val binding: ActivityMainBinding by viewbind() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.apply { textView.setText("Binding") } } } class MainActivity : Activity() { // DataBinding val binding: ActivityMainBinding by databind(R.layout.activity_main) // ViewBinding val binding: ActivityMainBinding by viewbind() } class FragmentActivity : Activity() { // DataBinding val binding: ActivityMainBinding by databind(R.layout.activity_main) // ViewBinding val binding: ActivityMainBinding by viewbind() } ``` * 在 `Fragment` 中提供了两种方式,他们的使用位置不同,如下所示。 * 方式一:在 `onCreateView` 中使用,[查看详细示例](https://github.com/hi-dhl/Binding/tree/main/app/src/main/java/com/hi/dhl/demo/binding/navigation) * 方式二:在 `onViewCreated` 中使用,查看详细示例 [ViewBindFragment.kt](https://github.com/hi-dhl/Binding/blob/main/app/src/main/java/com/hi/dhl/demo/binding/viewbind/ViewBindFragment.kt) 和 [DataBindRecycleFragment.kt](https://github.com/hi-dhl/Binding/blob/main/app/src/main/java/com/hi/dhl/demo/binding/databind/list/DataBindRecycleFragment.kt) **PS: 需要注意以下几点:** * 如果使用 `Navigaion` 作为新的 Fragment 管理框架,只能使用 `方式一`,[查看详细示例](https://github.com/hi-dhl/Binding/tree/main/app/src/main/java/com/hi/dhl/demo/binding/navigation) * 在 `BottomSheetDialogFragment` 中,只能使用 `方式一` * 在其他 Fragment 场景中,如果使用 `方式二` 界面不显示,改用 `方式一` 即可解决 ``` 方式一: class FragmentNav1 : Fragment(R.layout.fragment_main) { // DataBinding val binding: FragmentMainBinding by databind() // ViewBinding val binding: FragmentMainBinding by viewbind() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return binding.root } } 方式二: class FragmentNav1 : Fragment(R.layout.fragment_main) { // DataBinding val binding: FragmentMainBinding by databind() // ViewBinding val binding: FragmentMainBinding by viewbind() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.apply { textView.setText("Binding") } } } ``` * 在 `Dialog` 中使用方式如下所示。 ``` class AppDialog(context: Context) : Dialog(context, R.style.AppDialog) { // DataBinding val binding: DialogAppBinding by databind(R.layout.dialog_data_binding) // ViewBinding val binding: DialogAppBinding by viewbind() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.apply { result.setText("DialogAppBinding") } } } ``` 或者添加生命周期监听 ``` class AppDialog(context: Context,lifecycle: Lifecycle) : Dialog(context, R.style.AppDialog) { // DataBinding 监听生命周期 val binding: DialogAppBinding by databind(R.layout.dialog_data_binding, lifecycle) // ViewBinding 监听生命周期 val binding: DialogAppBinding by viewbind(lifecycle) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.apply { result.setText("DialogAppBinding") } } } ``` * 扩展方法,支持 DataBinding 初始化的时候绑定数据,感谢 `@br3ant` 贡献,[查看详细示例](https://github.com/hi-dhl/Binding/blob/054aa169d8dd39023be55be589b67e8097702bd1/app/src/main/java/com/hi/dhl/demo/binding/databind/DatBindActivity.kt#L28-L33) ``` val binding: ActivityDataBindBinding by databind(R.layout.activity_data_bind) { val account = Account() account.name = "test" this.account = account } ``` ### 混淆 ``` -keepclassmembers class ** implements androidx.viewbinding.ViewBinding { public static ** bind(***); public static ** inflate(***); } ``` ### 更新记录 **2020-12-21(V1.0.5)** * 支持在 navigation fragment 中使用 DataBinding 和 ViewBinding,[查看详细示例](https://github.com/hi-dhl/Binding/tree/main/app/src/main/java/com/hi/dhl/demo/binding/navigation) **2020-12-17(V1.0.4)** * 支持所有与 RecyclerView.ViewHolder 相关的 Adapter(ListAdapter、PagingDataAdapter、RecyclerView.Adapter 等等)使用 DataBinding 和 ViewBinding,[查看详细示例](https://github.com/hi-dhl/Binding/blob/main/app/src/main/java/com/hi/dhl/demo/binding/databind/list/ProductAdapter.kt) * 支持通过 `by databind` 初始化,同时可以绑定数据,感谢 `@br3ant` 贡献,[查看详细示例](https://github.com/hi-dhl/Binding/blob/054aa169d8dd39023be55be589b67e8097702bd1/app/src/main/java/com/hi/dhl/demo/binding/databind/DatBindActivity.kt#L28-L33) **2020-12-15(V1.0.3)** * 添加了 DataBinding 在 Dialog 中的使用, `by databind(R.layout.dialog_data_binding)` 或者 `by databind(R.layout.dialog_data_binding, lifecycle)` * 处理了 `大于等于 Android 10.0` 和 `小于 Android 10.0` 生命周期问题,当处于 `onDestroyed()` 时会自动销毁数据 * 最低 SDK 版本降低至 14 **2020-12-14:** * Demo 增加 DataBinding 示例 * Demo 增加 ViewBinding 示例 * Demo 增加 kotlin-parcelize 示例 **2020-12-13(V1.0.1)** * 添加了 ViewBinding 在 Dialog 中的使用, `by viewbind()` 或者 `by viewbind(lifecycle)` **2020-12-12(V1.0.0)** * 添加 DataBinding 和 ViewBinding 在 `Activity` 、`AppCompatActivity` 、`FragmentActivity` 、`Fragment` 中的使用 * 避免模板代码,只需要一行代码即可实现 DataBinding 或者 ViewBinding * 当生命周期处于 `onDestroyed()` 时会自动销毁数据 ### 联系我 * 个人微信:hi-dhl * 公众号:ByteCode,包含 Jetpack ,Kotlin ,Android 10 系列源码,译文,LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题 等等一系列文章 --- 最后推荐我一直在更新维护的项目和网站: * 计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看:[AndroidX-Jetpack-Practice](https://github.com/hi-dhl/AndroidX-Jetpack-Practice) * LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析
* 剑指 offer 及国内外大厂面试题解:[在线阅读](https://offer.hi-dhl.com) * LeetCode 系列题解:[在线阅读](https://leetcode.hi-dhl.com) * 最新 Android 10 源码分析系列文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,仓库持续更新,欢迎前去查看 [Android10-Source-Analysis](https://github.com/hi-dhl/Android10-Source-Analysis) * 整理和翻译一系列精选国外的技术文章,每篇文章都会有**译者思考**部分,对原文的更加深入的解读,仓库持续更新,欢迎前去查看 [Technical-Article-Translation](https://github.com/hi-dhl/Technical-Article-Translation) * 「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址,欢迎前去查看 [为互联网人而设计导航网站](https://site.51git.cn) **感谢** 中文: 感谢 [Simple one-liner ViewBinding in Fragments and Activities with Kotlin](https://medium.com/@Zhuinden/simple-one-liner-viewbinding-in-fragments-and-activities-with-kotlin-961430c6c07c) 文章带来的思路,以及从 [Anko](https://github.com/Kotlin/anko) 、和 [ViewBindingDelegate](https://github.com/hoc081098/ViewBindingDelegate) 等等开源库中学习到技巧 English: Thanks to the [Simple one-liner ViewBinding in Fragments and Activities with Kotlin](https://medium.com/@Zhuinden/simple-one-liner-viewbinding-in-fragments-and-activities-with-kotlin-961430c6c07c) 、 [ViewBindingDelegate](https://github.com/hoc081098/ViewBindingDelegate) and [Anko](https://github.com/Kotlin/anko) ... open source project