欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android dataBinding

程序员文章站 2022-06-09 20:21:59
...

一、

使用DataBinding需要Android Gradle插件的支持,版本至少在1.5以上,需要的Android studio的版本在1.3以上。

在Android Studio中使用需要在Module下的build.gradle中添加

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

二、

创建一个User类用来测试

public class User {
    private int id;
    private String username;
    ...get/set方法
}

将activity_main.xml修改一下

<?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"
    tools:context=".MainActivity"
    >
<data>
    <variable
        name="user"
        type="com.du.databinding4.bean.User"/>
</data>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

  
</RelativeLayout>

</layout>

添加两个TextView来显示信息,注意android:text属性,可以理解为tvId显示user.id属性,tvUsername显示user.username属性。第一次我在tvId的text属性中直接写的user.id,结果报错了,因为user.id为int类型,在系统调用TextView.setText方法时,调用成TextView.setText(int id)这个方法,我当时设置user.id=1,找不到id=1的String资源,所以报错了,这里直接调用了Stirng.valueof()方法即可。

    <TextView
        android:id="@+id/tvId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@{String.valueOf(user.id)}" />

    <TextView
        android:id="@+id/tvUsername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="187dp"
        android:text="@{user.username}" />

到这里需要rebuild一下,这样才能生成相应的类。

我们的布局文件是activity_main.xml,框架就会帮我们生成的类名为ActivityMainBinding。

在MainActivity.java中修改原来的setContentView为DataBindingUtil.setContentView(this , R.layout.activity_main);

public class MainActivity extends Activity {
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this , R.layout.activity_main);
        binding.setUser(user);
        user.setId(1);
        user.setUsername("jack");
    }
}

Android dataBinding

三、

此时在界面中加上一个Button,我们的预想效果是:当点击按钮时,将user.id=2;user.username=rose显示出来

    /**
     * 按钮点击事件
     * @param view
     */
    public void setUser(View view){
        user.setId(2);
        user.setUsername("rose");
    }

运行项目,点击按钮后并没有达到预想的显示2,rose

想有这种效果需要修改一下User类

继承了BaseObservable类,并且在get方法上添加@Bindable,添加后建议rebuild下,notifyPropertyChanged()方法,从字面上来看就是提醒属性改变,BR类似于我们项目中的R文件。之前rebuild,就是为了在BR文件中生成 添加@Bindable标签的属性。

package com.du.databinding4.bean;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

import com.du.databinding4.BR;

public class User extends BaseObservable {
    private int id;
    private String username;
    @Bindable
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
        notifyPropertyChanged(BR.id);
    }
    @Bindable
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
        notifyPropertyChanged(BR.username);
    }
}

此时在运行项目,点击了按钮后达到了我们预期的效果。

三、

添加一个EditView,我们预想的效果是,将这个EditText与User.username绑定,只要在editText中输入内容,就会赋值给user对象的username

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/button"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="@={user.username}"
        android:hint="username" />

注意,android:text="@={user.username}",这里多了一个=

运行项目发现user.username已经与editText绑定了