Android---Data Binding使用入门 Android---Data Binding使用入门

Android---Data Binding使用入门

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

准备工作

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

dataBinding {
        enabled = true
    }
  • 1
  • 2
  • 3

添加的位置是这样的

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    dataBinding {
        enabled = true
    }

    defaultConfig {
        applicationId "c.sample"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然后准备好布局,布局的文件名是会直接跟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

可以看到在布局文件中的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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

注意,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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行一下,效果如图: 
这里写图片描述

好了,这只是一些基本的用法,感兴趣的朋友可以自己去看看官网,还有很多高级用法这里就不列举了。

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

准备工作

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

dataBinding {
        enabled = true
    }
  • 1
  • 2
  • 3

添加的位置是这样的

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    dataBinding {
        enabled = true
    }

    defaultConfig {
        applicationId "c.sample"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然后准备好布局,布局的文件名是会直接跟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

可以看到在布局文件中的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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

注意,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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行一下,效果如图: 
这里写图片描述

好了,这只是一些基本的用法,感兴趣的朋友可以自己去看看官网,还有很多高级用法这里就不列举了。

猜你喜欢

转载自blog.csdn.net/u012602304/article/details/80847603