Android ViewBinding和DataBinding的几个使用方式 -下

3,252 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)

欢迎关注公众号【空名先生】获取更多资源和交流!

👉前提

这是小空坚持写的Android新手向系列,欢迎品尝。

新手(√√√)

大佬(√)

👉实践过程

😜DataBinding

优点

  • 支持 data 和 view 双向绑定
  • 避免了控件空指针的错误,findViewById中就可能造成空指针或类型转换错误。
  • 效率高,遍历一次就将所有的控件引用生成

缺点

  • 布局必须嵌套一层layout标签,改造成本大
  • 灵活性不高,如果需要动态切换布局,则多个布局必须根节点必须一致。
  • 在 Activity、Fragment、Dialog、Adapter 中 ViewBinding 和 DataBinding 初始化方式有些不同
  • 需要单独处理 include 带 merge 标签的布局,和不带 merge 标签的布局等等

Android Studio3.6以上

android {
    dataBinding{
        enabled = true
    }
}

Android Studio4.0以上

android {
    buildFeatures {
        dataBinding= true
    }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
	   <!--有个user的实体类-->
       <variable name="user" type="com.zhima.User"/>
   </data>
   
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.name}"/>
           
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.sex}"/>
   </LinearLayout>
</layout>

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("空名先生", "未知");
binding.setUser(user);

实现了布局和数据的绑定,但也同时增加了对xml的侵入性

😜插件+委托

上面介绍了ViewBinding和DataBinding,需要写的模板代码很多,那么如何省略这些呢?有没有更“骚”的方式? 那就是利用插件

dependencies {
	//最新的到1.0.5版本  地址:https://github.com/hi-dhl/JDataBinding
    implementation 'com.hi-dhl:binding:1.0.5'
}
//Dialog
class AppDialog(context: Context) : Dialog(context, R.style.AppDialog) {
    val binding: DialogAppBinding by viewbind()
    //binding.你的控件名即可
}
//Activity
class MainActivity : AppCompatActivity() {
    // DataBinding
    val binding: ActivityMainBinding by databind(R.layout.activity_main)
    // ViewBinding
    val binding: ActivityMainBinding by viewbind()
    //binding.你的控件名即可
}
//Fragment
class MainFragment : Fragment(R.layout.fragment_main) {
   // DataBinding
   val binding: FragmentMainBinding by databind()
    // ViewBinding
   val binding: FragmentMainBinding by viewbind()
    //binding.你的控件名即可
}

😜总结

ButterKnife,kotlin-android-extensions,viewbinding和databinding,都是成熟方案你都可以用,而且可以同时使用,想用哪个用哪个(只要不嫌乱),但要注意时效性,说不准哪天就被废弃了。而findViewById,从Android诞生一直到现在仍然兼容性最高。

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:芝麻粒儿 的个人主页 - 专栏 - 掘金 (juejin.cn)

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。