DataBinding简单入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MonaLisaTearr/article/details/80838393

        databinding这东西,两年前用过一次之后就没有再用了,毕竟公司没有这样的需求,东西久不用了肯定会生疏,生疏不要紧,只要在用到的时候能快速查到相关资料即可,那么最好的方法肯定就是自己写日志啦!

简介:

        首先我们先说说databinding是什么,顾名思义,"数据绑定"!不知道大家有没有接触过MVVM框架,其实databinding可以说跟MVVM框架契合度是非常高的,他的数据绑定方式颠覆了原有的android原生的数据绑定方式,使用了databinding之后,你不会再看到类似findViewById()、setText()等等语句,你需要做的仅仅是改变数据即可,这也就是所谓的数据驱动型,至于什么是数据驱动型,大家不妨往下看,看完自然就能体会到了!!今天我们先用一个简单的例子去实现一个单向的数据绑定过程,并通过改变数据实现UI的刷新。后续会介绍更高级的使用方式,比如说数据双向绑定。

一、使用databinding前提,以及启用

1、android2.1或更高平台
2、gradle 1.5或更高版本
3、android studio1.3或更高版本
4、启用databinding,只需要在Moudle的build.gradle中的android节点中加入下面配置即可:

android {
    
     。。。
     
    dataBinding{
        enabled true
    }
}

二、xml文件编写

        使用databinding之后,我们最直观的感受的的变化就是xml的变化,如果对jsp文件熟悉的朋友会发现其编写方式跟jsp有那么一点像的!,那么我们先看看我写的:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="android.discovery.mvvmdemo.MainActivity">

    <data class="MainUserBinding">
        <import type="android.discovery.mvvmdemo.UserInfo" />
        <variable name="userInfo" type="UserInfo" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:gravity="center_vertical"
            android:text="@{userInfo.name}"
            android:textSize="34dp" />


        <TextView
            android:id="@+id/age"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:gravity="center_vertical"
            android:text="@{String.valueOf(userInfo.age)}"
            android:textSize="34dp" />
    </LinearLayout>
</layout>

1、外层标签

首先我们看到,我们的xml文件中最外层已经不是LinearLayout之类的ViewGroup了,而是换成了layout标签,这个是固定的写法,大家记住就好。

2、<data>

我们看到 <data class="MainUserBinding">节点,也是databinding特有的,这个data其实是整个xml文件的描述,程序在解析到data标签时,会把整个xml文件映射成一个MainUserBinding.calss的文件,内部维护了整个xml文件的所有元素,包括我们通过import导入的,我们去瞧瞧:

文件路径:build/intermediates/classes/debug/包名/databinding/MainUserBinding.class

public class MainUserBinding extends ViewDataBinding {
    @Nullable
    private static final IncludedLayouts sIncludes = null;
    @Nullable
    private static final SparseIntArray sViewsWithIds = null;
    @NonNull
    public final TextView age;
    @NonNull
    private final LinearLayout mboundView0;
    @NonNull
    public final TextView name;
    @Nullable
    private UserInfo mUserInfo;
    private long mDirtyFlags = -1L;
    //此处省略N行。。。。。

我们现阶段先别去纠结它的原理我们先能用起来,体验一下效果再说!还有就是class="MainUserBinding"这个不是必须的,这个值如果我们不定义的话,会根据xml文件名生成,如activity_main.xml会生成ActivityMainBinding.class,看个人喜欢!

3、variable节点

        这个节点的作用是声明或者说是绑定一些我们需要使用的数据实体或者相关的对象,说得直白点就跟定义个变量差不多,其中name指定了所声明对象的名称,type为对象类型,在上面代码中我们使用了import的方式进行引入,其实这里是有一定用意的,这里只是想告诉大家,如果我们想要使用jdk中的类,也是可以import进来的。当然还有另外一种写法如下:

<variable name="info" type="android.discovery.mvvmdemo.UserInfo"/>

PS:这里的UserInfo只是一个普通的javabean,后面贴代码

4、数据绑定

我们看到声明好具体的数据对象之后,我们就可以使用该对象队具体的View进行数据绑定了,如下:
android:text="@{userInfo.name}"

android:text="@{String.valueOf(userInfo.age)}"

这里我们数据绑定的方式也是一种固定的写法,使用@{},值得注意的是,由于我们UserInfo里面定义的age是一个int类型的数据,但是TextView的text只能接受String类型的,所以我们使用String.value()转,但是我们并没有import java.lang.String ,其实java.lang包是默认已经被导入的了,可以直接使用!

三、java代码实现

1、首先先我们看下Activity中的实现

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";
    private UserInfo mUserInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainUserBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mUserInfo = new UserInfo("老王",18);
        binding.setUserInfo(mUserInfo);//在xml中声明后编译自动生成get、set方法
    }
}

我们看到原始的setContentView()被替换成了 DataBindingUtil.setContentView(),并且返回了对应的MainUserBinding对象,然后通过setUserInfo方法设置UserInfo对象,这里强调下,当我们使用variable去声明某个对象的时候,就会在MainUserBinding中自动生成对应的get和set方法。」

2、接着我们看下UserInfo

public class UserInfo {
    public String name;
    public int age;

    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

至此,我们的数据就真正的跟我们对应的View绑定上了,运行看下效果图:


四、数据的驱动型

我们刚开始的时候说databinding属于数据驱动型,按么我们接下来看看什么是数据驱动

1、首先我们创建一个Timer,每隔2秒钟就随机设置UserInfo中的年龄数据:

private void ininTimer() {
        final Random random = new Random();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Log.d(TAG,"=======改变内容=======");
                mUserInfo.setAge(random.nextInt(100));
            }
        },2000,2000);
    }

页面有什么变化:


可以看到,我们的页面是跟着在刷新的,当然,不仅仅是加了上面那段代码就行的,我们还需要设置监听,我们只需要在所绑定的数据的实体类里面进行设置即可,如下:

public class UserInfo extends BaseObservable {
    public String name;
    public int age;

    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        notifyPropertyChanged(BR.age);
    }
}

从上面代码中我们可以看出,首先需要继承BaseObservable,然后在对应的get方法中添加注解@Bindable,最后在对应的set方法中添加notifyPropertyChanged(BR.age);即可,注意,只有添加了注解的属性,才会在BR中生成对应的字段标识。

不知道大家注意到了没有,从改变数据一直到UI的刷新,我们都没有调用过类似TextView.setText()这样的方法,我们仅仅是改变数据而已,UI就自动刷新了,这就是我前面所说的数据驱动了!!!

五、事件绑定

在android开发中,我们不可避免的会去监听一些控件的触摸事件,我们这里就从一个button最简单的点击事件开始入手

1、创建事件监听的Event对象,并定义onEvent()方法,以View作为参数返回

 public class Event{
        public void onEvent(View view) {
            Log.d(TAG,"Text="+((TextView)view).getText());
        }
 }

2、在data节点中声明该对象

<import type="android.discovery.mvvmdemo.MainActivity.Event"/>
<variable name="event" type="Event"/>

3、添加Button按钮,并设置监听

 <Button
      android:layout_width="match_parent"
      android:textSize="24dp"
      android:text="点击事件"
      android:onClick="@{event::onEvent}"
      android:layout_height="60dp" />

这里的监听设置有好几种方式:

  • event.onEvent
  • event::onEvent
  • (thisview)->event.onEvent(thisview),这种方式是lambda表达式的方式,如果我们定义了多个参数时需要一一对应好,否则编译出错

我们运行下点击看看效果:


总结:今天我们介绍了databinding如果引入,如何编写xml文件,如何在java中使用,如何设置事件监听等等,总得来说的只是databinding的一点点皮毛,就当先对它有个小小的印象吧!!毕竟这个框架也不是一天两天能搞透的。。。

Demo源码





猜你喜欢

转载自blog.csdn.net/MonaLisaTearr/article/details/80838393