Android---Data Binding使用入门

一直没使用过Data Binding,今天就来学习一下,有兴趣的朋友可以直接看官网的介绍Data Binding

准备工作

首先要在build.gradle中添加一句

dataBinding {
        enabled = true
    }123

添加的位置是这样的

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    dataBinding {
        enabled = true
    }

    defaultConfig {
        applicationId "c.sample"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
12345678910111213141516

然后准备好布局,布局的文件名是会直接跟binding挂钩的,布局的时候xml的布局文件就不再单纯地展示 UI 元素,还需要定义 UI 元素用到的变量。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data

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

    <data>
        <variable
            name="user"
            type="c.sample.User" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}" />
        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}" />
    </LinearLayout>
</layout>1234567891011121314151617181920212223242526

可以看到在布局文件中的data节点有一个variable,名字是user,后面的type是类完整的类名,这个是在包中定义好的一个类(也可以使用其他的类)可以用来为xml中的其他组件设置数据

package c.sample;


public class User {
    public String firstName;
    public String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}123456789101112

com.android.databinding会根据xml文件的名称 Generate 一个继承自 ViewDataBinding 的类。

例如,这里 xml 的文件名叫 activity_main.xml,那么生成的类就是 ActivityMainBinding。

继续在MainActivity中绑定variable

package c.sample;

import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;

import c.sample.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("dog","apple");
        binding.setUser(user);
        binding.tv1.setGravity(Gravity.CENTER);
        binding.tv1.setTextColor(Color.BLUE);
    }
}
1234567891011121314151617181920212223242526

注意,ActivityMainBinding 类是自动生成的,所有的 set 方法也是根据 variable 名称生成的,前面我们定义的是user,所以生成的也是setUser(),这里我还为第一个TextView设置了一下其他属性: 


一个简单的数据绑定就完成了,解放了findViewById;

对事件进行绑定监听

例如:


onclick
onLongClick
onTextChange


对事件进行监听绑定的时候,绑定监听器接受的参数与返回值一定要与原监听器的接受一致 
修改一下代码,在MainActivity中增加一个类Presenter(类名好像必须为这个),里面放了几个事件监听的回调:

package c.sample;

import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;

import c.sample.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;

    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        user = new User("dog","apple");
        binding.setUser(user);
        binding.setPresenter(new Presenter());
        binding.tv1.setGravity(Gravity.CENTER);
        binding.tv1.setTextColor(Color.BLUE);
    }

    public class Presenter {
        public void onClickFriend(View view) {
            Toast.makeText(MainActivity.this, "ABCDEFG", Toast.LENGTH_SHORT).show();
        }

        public boolean onLongClickFraiend(View view) {
            Toast.makeText(MainActivity.this,"AAAAAAAAAAAAAAA",Toast.LENGTH_SHORT).show();
            return true;
        }

        public void  onTextChange(CharSequence text, int start, int lengthBefore, int lengthAfter) {
            user.setFirstName(text.toString());
            binding.setUser(user);
        }
    }
}123456789101112131415161718192021222324252627282930313233343536373839404142434445

activity_main.xml

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

    <data>
        <variable name="user" type="c.sample.User" />
        <variable name="presenter" type="c.sample.MainActivity.Presenter" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onTextChanged="@{presenter.onTextChange}"/>
        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            android:onClick="@{presenter.onClickFriend}"/>
        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"
            android:onLongClick="@{presenter.onLongClickFraiend}"
            />
    </LinearLayout>
</layout>1234567891011121314151617181920212223242526272829303132

运行一下,效果如图: 


好了,这只是一些基本的用法,感兴趣的朋友可以自己去看看官网,还有很多高级用法这里就不列举了。
--------------------- 
作者:白沙丶 
来源:CSDN 
原文:https://blog.csdn.net/twoboat/article/details/52622863 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/hk121/article/details/85036852