一直在犹豫去写Jetpack组件的一系列文章,实话实说,我本身的项目中也很少有使用到Jetpack的一些库。那么在写文章之前,我还是要去实际的写demo。准备按照Architecture(架构)、Foundation(基础)、Behavior(行为)和UI(界面)的顺序去写。但没想到,Architecture的第一个库DataBinding,我在写了一点代码后,发现在实际的企业级项目中,使用DataBinding可能不太合适。所以,本篇主要是劝退你使用DataBinding。
我简单看了一些文章,简单尝试写了写,我发现在xml布局简单且数据源相对固定的情况下,DataBinding存在一定的优势。大体如下使用:
(1)build.gradle 文件中的 android 节点里添加 dataBinding 配置
(2)xml里面增加标签
(3)获取ViewDataBinding对象
(4)绑定数据
但是问题也比较明显:
(1)如果xml布局比较复杂,或者在后续的迭代中引入了新的布局元素,新的数据源和数据更新逻辑,那么真的会很头疼。
(2)需要修改xml的结构,在xml外部嵌套一个标签,并且需要手动build才能生成DataBinding相关类等。
(3)外国网友总结的更多的缺点:https://medium.com/@hellotimmutton/an-argument-against-data-binding-13e2aaf7a9b1
基于以上的一些问题,它确实不如另外一个比较成熟的方案:ButterKnifeGitHub - JakeWharton/butterknife: Bind Android views and callbacks to fields and methods.
通过注解@BindView实现findViewById的效果,大大省去了findViewById的代码,如下所示:
public class MainActivity extends AppCompatActivity {@BindView(R.id.text_view)TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);}}
但是,随着Android组件化开发的成熟,ButterKnife也暴露出了问题:在Android项目的library模块中,生成R类中的成员变量就已经改为了非final修饰,这一改变直接致使ButterKnife无法在Android项目的library模块中使用,为了能够让ButterKnife运行在library模块,ButterKnife的作者通过生成R2类让ButterKnife在library模块中继续使用,虽然这样也能使用,但是也带来了很多其他的问题,每个library模块会存在两个R文件,R2的id还会经常找不到等等,最后作者也不得不发出声明,此工具以被弃用,功能开发和一般错误也会停止维护。
那么,有没有比较好的方案?ViewBinding可能是最佳的选择了。ViewBinding是Google在2019年I/O大会上公布的一款Android视图绑定工具。它的使用方式有点类似DataBinding,但相比DataBinding,ViewBinding是一个更轻量级、更纯粹的findViewById的替代方案。