1. 程式人生 > >Android-0.DataBinding基礎示例

Android-0.DataBinding基礎示例

基礎示例

1.在module的build.gradleandroid節點中新增如下配置:

android {
    // 啟用dataBinding
    dataBinding{
        enabled = true;
    }
    ......
 }

2.建立一個簡單的UserBean類:

public class UserBean {
    private String name; //姓名
    private int age; //年齡

    public UserBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

注意get/set方式是需要定義的,不然會提示:

msg:Could not find accessor xxx

3.使用了DataBinding之後的Activity的佈局檔案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="myvideo.duowan.com.databindingdemo.bean.UserBean"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"/>

        <!--注意:這裡age是int型別,必須轉化為String,否則會執行時異常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}"/>
    </LinearLayout>
</layout>

根節點變成了layout,裡面包括了data節點和傳統的佈局。 data節點中宣告一個variable變數,名字叫user,關聯了type為UserBean物件。 而TextView中使用了android:text="@{user.name}"android:text="@{String.valueOf(user.age)}"來直接訪問UserBean的兩個私有成員.

4.MainActivity

import myvideo.duowan.com.databindingdemo.databinding.ActivityMainBinding;// 匯入

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 根據佈局檔案的名稱生成Binding類的規則為:以大寫形式開始,刪除下劃線(_),並使用駝峰命名,然後字尾為“Binding”
        // eg: activity_main-->ActivityMainBinding
        // 同時必須import 包名.databinding.ActivityMainBinding;
        ActivityMainBinding  binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserBean userBean = new UserBean("張三",25);
        binding.setUser(userBean);
    }
}

根據佈局檔案的名稱生成Binding類的規則為:以大寫形式開始,刪除下劃線(_),並使用駝峰命名,然後字尾為“Binding”。例如:activity_main–>ActivityMainBinding

ActivityMainBinding是系統自動生成的類,需要import 包名.databinding.ActivityMainBinding;

binding.setUser是自動生成的函式,set/get + variable變數的名字user(第一個字母大寫)

執行結果:

系統自動生成的ActivityMainBinding不能被除錯,一般位於databinding\ActivityMainBinding.java

1.在xml中引入一些基礎變數Variables

activity_main.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="str"
            type="String" />

        <variable
            name="age"
            type="int" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{str}" />

        <!--注意:這裡age是int型別,必須轉化為String,否則會執行時異常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(age)}" />
    </LinearLayout>
</layout>

MainActivity:


import myvideo.duowan.com.databindingdemo.databinding.ActivityMainBinding;// 匯入

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 根據佈局檔案的名稱生成Binding類的規則為:以大寫形式開始,刪除下劃線(_),並使用駝峰命名,然後字尾為“Binding”
        // eg: activity_main-->ActivityMainBinding
        // 同時必須import 包名.databinding.ActivityMainBinding;
        ActivityMainBinding  binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setStr("張三");
        binding.setAge(25);
    }
}

執行結果和前面一樣,注意這時使用的是binding.setStr+binding.setAge,分別對應variable變數的名字name="str"+ name="age"

2.引入一些高階變數Variables

在上面,我們學會了如何在xml中定義變數,以及在控制元件中使用。同樣,我們可以在data中定義像List、Map,陣列等這樣的集合變數,只是它的實現稍微有點不同,下面就一起來看看是如何定義以及使用的。