Android dataBinding

使用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");
    }
}


此时在界面中加上一个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;
    }
    @Bindable
    public void setUsername(String username) {
        this.username = username;
        notifyPropertyChanged(BR.username);
    }
}

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

猜你喜欢

转载自blog.csdn.net/Du_ZiLin/article/details/80895358