# AndroidBinding **Repository Path**: Li_Shuaihua/AndroidBinding ## Basic Information - **Project Name**: AndroidBinding - **Description**: No description available - **Primary Language**: Kotlin - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-31 - **Last Updated**: 2021-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AndroidBinding 简单的 API 实现 DataBinding 和 ViewBinding, ## 关于 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)。 * 这篇文章 [竟然如此简单,DataBinding 和 ViewBinding](https://mp.weixin.qq.com/s/omn7AhHzihhtr0vtq6csNg) 从使用的角度分析了 DataBinding 和 ViewBinding 不同之处,同时也介绍了如何用更简单的方式实现 DataBinding 和 ViewBinding。 感谢小伙伴们的建议,目前 Binding 已经适配了大量的场景,同时也提供了很多 DataBinding 和 ViewBinding 实战案例,如果你在使用过程中遇到 Binding 不兼容的场景,欢迎提 issue,我会尽快解决。 **如果这个仓库对你有帮助,请在仓库右上角帮我 star 一下,非常感谢你的支持,同时也欢迎你提交 PR** ❤️❤️❤️ **[Binding](https://github.com/ewgat/BindingDemo) 具有以下优点:** * 支持在自定义 ViewGroup 使用 DataBinding 或者 ViewBinding * 提供了很多实战案例包含 `Ativity` 、 `Fragment` 、 `Dialog` 、 `Adapter` 、 `include` 、 `merge` 、 `ViewStub` 、 `Navigation` 、 数据双向绑定 等等场景 * 简单的 API 只需要一行代码即可实现 DataBinding 或者 ViewBinding * 支持在 `Activity` 、`AppCompatActivity` 、`FragmentActivity` 、`Fragment` 、`Dialog` 中的使用 DataBinding 或者 ViewBinding * 支持在 `ListAdapter` 、 `PagedListAdapter` 、 `PagingDataAdapter` 、 `RecyclerView.Adapter` 中的使用 DataBinding 或者 ViewBinding * 支持在 Navigaion Fragment 管理框架、 BottomSheetDialogFragment 等等场景中使用 DataBinding 和 ViewBinding * 避免大量的模板代码 * 避免内存泄露,具有生命周期感知能力,当生命周期处于 `onDestroyed()` 时会自动销毁数据 ## Download **添加 jcenter** 将下列代码添加在 Project 级别的 `build.gradle` 文件中 ``` allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` ``` dependencies { implementation 'com.github.ewgcat:AndroidBinding:1.0.0' } ``` **添加依赖** 将下列代码添加在模块级 `build.gradle` 文件中,并且需要开启 DataBinding 或者 ViewBinding ``` android { buildFeatures { dataBinding = true viewBinding = true } } dependencies { implementation 'com.hi-dhl:binding:1.0.9' } ``` ## 简单的 API Binding 统一封装了 DataBinding 和 ViewBinding, 提供了简单的 API 如下所示。 **ViewBinding 中的使用** ``` val binding: ActivityViewBindBinding by viewbind() ``` **DataBinding 中的使用** ``` val binding: ActivityDataBindBinding by databind(R.layout.activity_data_bind) 或者 val binding: ActivityDataBindBinding by databind() ``` 我们来看一下在 `Ativity` 、 `Fragment` 、 `Dialog` 、 `Adapter` 、 `include` 、 `merge` 、 `ViewStub` 、 `Navigation` 、 `ViewGroup` 、 数据双向绑定 等等场景中如何使用。 ## 使用 在自定义 ViewGroup 中使用 DataBinding 和 ViewBinding,添加 `by viewbind()` 或者 `by databind(R.layout.activity_main)` 即可,示例如下所示。 ``` class ViewBindCustomView @JvmOverloads constructor( context: Context, attr: AttributeSet? = null, defStyleAttr: Int = 0, ) : LinearLayout(context, attr, defStyleAttr) { // ViewBinding val binding: LayoutViewCustomBinding by viewbind() // DataBinding val binding: LayoutViewCustomDataBinding by databind(R.layout.layout_view_custom_data) init { with(binding) { result.setText("在自定义 ViewGroup 中使用 DataBinding 或者 ViewBinding") } } } ``` 在 Adapter 中使用 DataBinding 和 ViewBinding,只需要在 ViewHolder 中添加 `by viewbind()` 或者 `by databind()` 即可, ``` 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" } } } ``` 在 `Activity` 、`AppCompatActivity` 、`FragmentActivity` 中使用,添加 `by viewbind()` 或者 `by databind(R.layout.activity_main)` 即可,示例如下所示。 ``` class MainActivity : AppCompatActivity() { // DataBinding val binding: ActivityMainBinding by databind(R.layout.activity_main) // ViewBinding val binding: ActivityMainBinding by viewbind() } ``` 在 `Fragment` 中提供了两种方式: 在 `onViewCreated` ``` 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") } } } ``` 或者添加具有生命周期感知的 `Dialog`。 ``` 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 初始化的时候绑定数据 ``` val binding: ActivityDataBindBinding by databind(R.layout.activity_data_bind) { val account = Account() account.name = "test" this.account = account } ``` 不想为某个布局生成 binding 类,将下面属性添加到布局文件的根视图中 ``` ``` ### 混淆 ``` -keepclassmembers class ** implements androidx.viewbinding.ViewBinding { public static ** bind(***); public static ** inflate(***); } ```