1. 程式人生 > >Android---Data Binding使用入門

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!