Android专题Android控件使用篇Android告别老套篇

DataBinding告别findViewById()

2020-09-09  本文已影响0人  千夜零一

引言

  你有没有在开发android应用时被各个控件的id搞的晕头转向?随着项目的量级增大,越来越多的控件id,还需要你在activity和fragment中去声明,再去通过findViewById()方法去链接控件再使用,其实大可不必!DataBinding是JetPack中的成员,它的一大功能就是简化繁琐的findViewById()实现控件id自由。


介绍

  DataBinding,就如同它的名字一样,数据绑定。以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。(本文主要讲如何使用DataBinding及其原理)之后会在ViewModel讲解中将两者结合起来使用尽享丝滑~


如何使用

第一步:启用DadaBinding

只需要启用就能使用:(module下的build.gradle)

android {
    ....
    dataBinding {
        enabled = true
    }
}

第二步:布局文件中进行databinding绑定

绑定前:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".show.Case19">
    
</androidx.constraintlayout.widget.ConstraintLayout>
绑定方法:

window下:鼠标放置在最外层控件上,即androidx.constraintlayout.widget.ConstraintLayout上,按Alt+Insert快捷键出现右键,点击Convert data binding layout

mac下:同理,只不过快捷键换成了option+enter键

绑定后的布局变成了这样:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".show.Case19">
        <TextView
            android:id="@+id/tv_DataBindingShow"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="20sp"
            tools:ignore="MissingConstraints" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

我在布局里面简单添加了个TextView控件,设置了id值。

第三步:在Activity中使用databinding

public class Case19 extends AppCompatActivity {
    private ActivityCase19Binding binding;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_case19); //默认布局
        binding = DataBindingUtil.setContentView(this,R.layout.activity_case19);
        binding.tvDataBindingShow.setText("我是千夜零一,期待你的关注!");
    }
}

运行效果

DadaBinding.gif

取代findViewById方法

【解析】
1.为什么它能这样不通过findViewById就能调用控件的id呢?

  采用 DateBinding 后,所有的 View 会在 Binding 实例类生成对应的实例,而有 id 的 View 则会使用 public 进行修饰,而变量名的生成规则是==通过下划线分割大小写==,即 id = "@+id/main_view" 会生成对应的 mainView 的变量,我们可以直接通过 binding.mainView 获取,直接节省了在 activity 中声明一长串变量的步骤,也不需要再写 findViewById 方法或者加上 @BindView 的注解。

【解析】
2.DataBinding绑定后声明binding的ActivityCase19Binding类哪里来的?

  这是系统帮我们自动创建的,它的类名的生成规则是如果你是在Activity中声明DataBinding对象,则Activity打头,Fragment同理,其后跟着你的Activity名称,最后加上Binding,即,就是示例中的ActivityCase19Binding。这就是DataBinding帮我们创建的DataBinding对象。

【解析】
3.DataBinding绑定后声明的binding到底为什么能获取到id呢,又是怎么取代findViewById()方法的呢?

  这就不得不说到它绑定布局的方法了,它通过DataBindingUtil.setContentView()方法绑定布局layout文件,之后的操作在绑定这一步完成后全部交由DataBinding生成的ActivityCase19BindingImpl类去完成。

  你可能在打出ActivityCase19Binding之后就发现了DataBinDing也自动帮我们生成了这个工具类,用于将binding.tvDataBindingShow与布局文件中的控件联系起来,而这全部是由DataBinding来自动帮我们实现的。这就是它的强大之处啊!

拓展

这只是JetPack中的DataBinding的一个简单功能,之后更多好玩的需要结合ViewModel才能发挥出来,dataBinding+viewModel也是MVVM模式项目的标准搭配。

上一篇下一篇

猜你喜欢

热点阅读