持续创作,加速成长!这是我参与「掘金日新计划 · 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)
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。