美文网首页Jetpack
Android DataBinding(一)之 基本使用

Android DataBinding(一)之 基本使用

作者: Sharkchilli | 来源:发表于2020-12-23 17:52 被阅读0次

前言

DataBinding是谷歌开发的一个框架,主要做的就是让界面和数据绑定,数据变动的时候界面也随之变动。如果学过vue.js应该就知道这两者是类似的。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常

配置

我们需要在Model 的 build.gradle加入DataBinding 的支持,可以看到这和添加其他第三方类库不太一样,有一种亲儿子的感觉

android {
    dataBinding {
        enabled = true
    }
}

简单使用

打开布局文件,选中根布局的 ViewGroup,按住 Alt + 回车键,点击 “Convert to data binding layout”,就可以生成 DataBinding 需要的布局规则


image.png

点击后原文件会变成下面

<?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>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </LinearLayout>
</layout>

其实就是使用layout标签将原来的布局包住,再在里面添加了data标签,data标签就是来声明Model类的,所以接下来我们定义一个模型吧

package com.shart.model;

public class User {
    private String name;
    private String age;

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

接下来就可以在布局文件中关联model和视图的关系了

<data>
        <import type="com.shart.model.User" />

        <variable
            name="userInfo"
            type="User" />
    </data>

import为引入这个类型,也可以在variable的type属性中使用全类名。还可以在improt的属性中使用alias别名
在data中定义完类型后就可以在视图中使用了

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv_userName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{userInfo.name,default=zhoufan}" />

        <TextView
            android:id="@+id/tv_password"
            android:layout_marginTop="50dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{userInfo.age}" />

    </LinearLayout>

通过 @{userInfo.name} 使 TextView 引用到相关的变量,DataBinding 会将之映射到相应的getter方法
最后我们在Activity中去使用它

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("fujie", "23");
        viewDataBinding.setUserInfo(user);
    }

原本的setContentView被 DataBindingUtil.setContentView代替,其返回的是自动生成的布局文件对象

每个数据绑定布局文件都会生成一个绑定类,ViewDataBinding 的实例名是根据布局文件名来生成,将之改为首字母大写的驼峰命名法来命名,并省略布局文件名包含的下划线。控件的获取方式类似,但首字母小写

运行

image.png
注意
这里如果你的类路径写错,DataBinding很可能不会报出明显的错误。而是报它自动生成的类找不到。这是很恶心人的地方,所以你要去检测你的布局文件的类名是否写错。

参考

Android DataBinding 从入门到进阶

相关文章

网友评论

    本文标题:Android DataBinding(一)之 基本使用

    本文链接:https://www.haomeiwen.com/subject/aatunktx.html