1. 程式人生 > >Android之DataBinding的使用

Android之DataBinding的使用

一、DataBinding介紹
2015年穀歌I/O大會上介紹了一個框架DataBinding,DataBinding是一個數據繫結框架,以前我們在Activity裡寫很多的findViewById,很多人不想寫這個於是用了一些註解框架,可是註解框架無論效能多好,效率總是要低於findViewById的,現在如果我們使用DataBinding,就可以拋棄findViewById。DataBinding主要解決了兩個問題:

反射,註解(butterKnife)、DataBinding

  • 需要多次使用findViewById,損害了應用效能且令人厭煩
  • 更新UI資料需切換至UI執行緒,將資料分解對映到各個view比較麻煩

就讓我們具體來看看怎麼使用它吧。

二、DataBinding的基本使用

(1)DataBinding的匯入

在應用的build.gradle檔案中新增如下程式碼:

android {
    ...

    //匯入dataBinding支援
    dataBinding{
        enabled true
    }



    ...
}

注:如果出現找不到databinding的library的話是因為跟gradle的版本不相容,改成2.0.0

classpath 'com.android.tools.build:gradle:2.0.0'

(2)DataBinding基本使用包括以下內容:

● 單純的擺脫findviewbyid
● 繫結基本資料型別及String
● 繫結Model資料
● 繫結事件
● 通過靜態方法轉換資料型別
● 通過運算子操作資料
● 自定義Binding的類名
● 繫結相同Model的操作
● model變數改變自動更新資料
● 繫結List/Map等集合資料
● Observable自動更新
● Databinding與include標籤的結合
● DataBinding與RecyclerView的結合
● DataBinding和Fragment的使用
● DataBinding在Activity或Fragment中載入其他佈局
● DataBinding實現自定義DataBindingAdapter

(3)功能使用

3.1單純的擺脫findviewbyid

佈局檔案

<!--佈局以layout作為根佈局-->
<layout>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_tv1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="單純的擺脫findviewbyid" />
    </LinearLayout>
</layout>

佈局通過DataBindingUtils.setContentView()載入到程式碼中,而且會生成對應一個Binding物件,物件名是佈局檔案文稱加上Binding字尾

MainActivity中程式碼

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;//這個類是自動生成的

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成Binding物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);
        //通過binfding.id名稱---就相當於獲取了改控制元件物件了
        binding.mainTv1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                binding.mainTv1.setText("沒有findviewbyid了");
            }
        });
    }
}

通過Binding物件.id名稱,就相當於拿到了指定的佈局中的id的控制元件了,使用起來和findviewbyid獲取的控制元件是一樣的

3.2繫結基本資料和String
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>
        <!--繫結基本資料型別及String-->
        <!--name:   和java程式碼中的物件是類似的,名字自定義-->
        <!--type:   和java程式碼中的型別是一致的-->
        <variable
            name="content"
            type="String" />

        <variable
            name="enabled"
            type="boolean" />
    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!--繫結基本資料型別及String的使用是通過   @{資料型別的物件}  通過對應資料型別的控制顯示-->
        <Button
            android:id="@+id/main_tv2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="@{enabled}"
            android:text="@{content}" />
    </LinearLayout>
</layout>

在佈局中是通過@{}來繫結資料的,{}中是佈局中該控制元件屬性對應的資料型別資料,同時還可以支援運算子運算和靜態方法呼叫和轉換,這個後面會介紹

MainActivity檔案中

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        //2.繫結基本資料型別及String
        binding.setContent("對String型別資料的繫結");//setContent就是給佈局檔案text屬性繫結的content設定值
        binding.setEnabled(false);//設定enabled值為false
        //給控制元件設定點選事件,發現其實點選無效,因為在佈局檔案中給cilckable屬性綁定了enabled,在程式碼中設定enabled值為false,所以點選事件無效
        binding.mainTv2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "我被點選了", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

3.3繫結model資料

Model資料型別

public class User {
    private String text;

    public User(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

後面會對model資料做更詳細的講解,這裡先讓大家知道一下用法
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>
        <!--繫結Model資料2中形式,一中是匯入該型別的,一種指定型別的全稱,和java一樣-->
        <!--  方式一 -->
        <variable
            name="user"
            type="www.zhang.com.databinding.User" />
        <!--  方式二 -->
        <!--<import type="www.zhang.com.databinding.User" />-->
        <!--<variable-->
            <!--name="user"-->
            <!--type="User" />-->

    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:id="@+id/main_btn3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.text}" /><!--這裡user.text相當於user.getText()-->
    </LinearLayout>
</layout>

MainActivity中程式碼:

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        //3.繫結model物件資料
        User user = new User("繫結Model資料型別");
        binding.setUser(user);//或者 binding.setVariable(BR.user,user);
    }
}


binding設定資料有2中方式:
1.binding.setUser(user)
2.binding.setVariable(BR.user,user)–採用BR指定

3.4事件的繫結
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>
        <variable
            name="event"
            type="www.zhang.com.databinding.model.EventListener" />

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

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

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

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

    </data>
    <!--我們需要展示的佈局-->
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="@{event.click1}"
                android:text="@{title1}" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="@{event::click2}"
                android:text="@{title2}" />
            <!--android:onClick="@{event::click2}"  編譯報錯沒關係,可以執行的-->
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="@{()->event.cilck3(title4)}"
                android:text="@{title3}" />

        </LinearLayout>
</layout>

事件有多種寫法

1.android:onClick="@{event.click1}"
2.android:onClick="@{event::click2}"
3.android:onClick="@{()->event.cilck3(title4)}"

[注]:()->event.cilck3(title4)是lambda表示式寫法,
也可以寫成:(view)->event.cilck3(title4),前面(view)表示onClick方法的傳遞的引數,
如果event.click3()方法中不需要用到view引數,可以將view省略。

當然event.click1也可以寫成(view)->event.click1(view),將onClick(View view)的view引數傳遞給event.click1(view)方法。
大概就這意思,以下是虛擬碼

onclick(View view){
    event.click1(view)
}

EventListener介面

public interface EventListener{
    public void click1(View v);
    public void click2(View v);
    public void cilck3(String s);
}

MainActivity
public class MainActivity extends AppCompatActivity{

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        binding.setTitle1("事件繫結1");
        binding.setTitle2("事件繫結2");
        binding.setTitle3("事件繫結3");
        binding.setTitle4("change ok");

        binding.setEvent(new EventListener() {
            @Override
            public void click1(View v) {
                binding.setTitle1("事件1方法呼叫");
            }

            @Override
            public void click2(View v) {
                binding.setTitle2("事件2方法呼叫");
            }

            @Override
            public void cilck3(String s) {
                binding.setTitle3(s);
            }
        });
    }
}

3.5通過靜態方法轉化資料型別
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>
     <variable
            name="user"
            type="www.zhang.com.databinding.User" />

        <!--呼叫靜態方法,需要先匯入需要的包    當然java中的lang包可以不用導包-->
        <import type="www.zhang.com.databinding.Utils" />

    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{Utils.getName(user)}" /><!--就和java中寫程式碼一樣,只要符合資料型別就好-->
    </LinearLayout>
</layout>

靜態方法的類(當然也可以使用Java自帶API)

public class Utils {
    public static String getName(Object o) {
        return o.getClass().getName();
    }
}

3.6通過運算子操作資料
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>

        <variable
            name="user2"
            type="www.zhang.com.databinding.model.User" />

    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="@{user2.state ? @dimen/largepadding : (int)@dimen/smallpadding}"
            android:text="@{user2.content ?? @string/app_name}" />
        <!-- android:text="@{user2.content ?? @string/app_name}"
         等價於
         android:text="@{user2.content!=null? user2.content : @string/app_name}"-->

        <Button
            android:id="@+id/main_btn6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{`Hello World`+ @string/app_name}" /><!-- ``字元包裹的表示字串,可用作拼接字串 -->

    </LinearLayout>
</layout>
public class User {
    private String content;
    private boolean state;

    public User(String content, boolean state) {
        this.content = content;
        this.state = state;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

}

MainActivity中

package www.zhang.com.databinding;

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

import www.zhang.com.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        //運算子操作
        www.zhang.com.databinding.model.User user2 = new www.zhang.com.databinding.model.User("通過運算子操作資料", true);
//        user2 = new www.zhang.com.databinding.model.User(null, false);    改變資料作為測試DataBinding是否有效
        binding.setUser2(user2);

    }
}

DataBinding支援的表示式有:
數學表示式: + - / * %
字串拼接 +
邏輯表示式 && ||
位操作符 & | ^
一元操作符 + - ! ~
位移操作符 >> >>> <<
比較操作符 == > < >= <=
instanceof
分組操作符 ()
字面量 - character, String, numeric, null
強轉、方法呼叫
欄位訪問
陣列訪問 []
三元操作符 ?:
聚合判斷(Null Coalescing Operator)語法 ‘??’

3.7自定義Binding的類名
data標籤有個class屬性,它可以用來對Binding物件重新命名(一般是以佈局檔名加上Binding字尾作為該Binding類名)
檔案目錄如下

自定義類名有3中方式
1. 通過指定全類名的方式

<data class="www.zhang.com.databinding.activity.Item">
    ...
</data>
import www.zhang.com.databinding.activity.Item;

Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
  1. 直接生成在專案的包目錄下
<data class=".Item">
    ...
</data>
import www.zhang.com.databinding.Item;

Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
  1. 如果FiveActivity直接在包下與方式二相同,如果FiveActivity在包的子目錄下,則Binding生成的目錄如下
<data class="Item">
    ...
</data>
import www.zhang.com.databinding.databinding.Item;

Item binding =DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);

3.8繫結相同model的操作
繫結相同model我的理解有2種,一種是同類的2個物件,另一種是不同類的2個類,但類名相同,具體看程式碼:
● 第一種,同一個類的2個物件,只需物件名不同就可以
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>

        <import type="www.zhang.com.databinding.User" />

        <variable
        name="user3"
        type="User" />

        <variable
        name="user4"
        type="User" />

    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn7"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user3.text}" />

        <Button
            android:id="@+id/main_btn8"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user4.text}" />

    </LinearLayout>
</layout>

User類

public class User {
    private String text;

    public User(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

MainActivity中

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);


        User user3  = new User("相同類,不同物件1");
        binding.setUser3(user3);

        User user4 = new User("相同類,不同物件2");
        binding.setUser4(user4);

    }
}

● 第二種不同的2個類,物件名相同
佈局檔案


<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>

        <import type="www.zhang.com.databinding.User" />

        <variable
            name="user4"
            type="User" />

<!--因為type="User"都為User類,會導致不知道到那個包,所以可以通過alias屬性重新命名type的型別,但實際上alias被指定的那個型別(如:www.zhang.com.databinding.model.User)-->
        <import type="www.zhang.com.databinding.model.User" alias="Model"/>

        <variable
            name="user5"
            type="Model"  />

    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn8"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user4.text}" />

        <Button
            android:id="@+id/main_btn9"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user5.content}" />

    </LinearLayout>
</layout>

因為2個地方都有type=”User”都為User類,會導致不知道匯入哪個包,所以可以通過alias屬性重新命名type的型別,但實際上是alias被指定的那個型別(如:www.zhang.com.databinding.model.User)
2個不同的User類

package www.zhang.com.databinding;

public class User {
    private String text;

    public User(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}
package www.zhang.com.databinding.model;

public class User {
    private String content;
    private boolean state;

    public User(String content, boolean state) {
        this.content = content;
        this.state = state;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

}

MainActivity

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過DataBInding載入佈局都會對應的生成一個物件,如ActivityMainBinding,物件名在佈局檔名稱後加上了一個字尾Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        User user4 = new User("相同類,不同物件2");
        binding.setUser4(user4);

        www.zhang.com.databinding.model.User user5 = new www.zhang.com.databinding.model.User("類名相同,但不是相同的2個類",false);
        binding.setUser5(user5);

    }
}

3.9model變數改變自動更新資料

前面講了DataBinding對基本資料型別及Model的使用以及運算子等操作,但這些基本是靜態的去設定資料,現在我們來看看 如何在資料改變時,不手動設定,讓其自動改變。

佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>

        <import type="www.zhang.com.databinding.model.Person" />

        <variable
            name="person"
            type="Person" />
    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="@{`firstName:`+person.firstName}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="@{`lastName:`+person.lastName}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="@{`age:`+person.age}" />

        <Button
            android:id="@+id/second_btn1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="改變資料" />

    </LinearLayout>
</layout>

Person類

package www.zhang.com.databinding.model;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

import www.zhang.com.databinding.BR;

public class Person extends BaseObservable {
    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    @Bindable
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    @Bindable
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }

    @Bindable
    public int getAge() {
        return age;
    }

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

Model類繼承BaseObservable,BaseObservable實現Android.databinding.Observable介面,Observable介面可以允許附加一個監聽器到model物件以便監聽物件上的所有屬性的變化。
Observable介面有一個機制來新增和刪除監聽器,但通知與否由開發人員管理。為了使開發更容易,BaseObservable實現了監聽器註冊機制。DataBinding實現類依然負責通知當屬性改變時。這是通過指定一個Bindable註解給getter以及setter內通知來完成的。
notifyPropertyChanged(BR.引數名)通知更新這一個引數,需要與@Bindable註解配合使用。notifyChange()通知更新所有引數,可以不用和@Bindable註解配合使用
SecondActivity

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivitySecondBinding binding = DataBindingUtil.setContentView(SecondActivity.this, R.layout.activity_second);

        final Person person = new Person("zhang","san",38);
        binding.setPerson(person);

        binding.secondBtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                person.setFirstName("li");
                person.setLastName("si");
                person.setAge(40);
            }
        });
    }
}

3.10繫結List/Map等集合資料
佈局檔案

<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>

    <data>

        <import type="java.util.ArrayList" />

        <import type="java.lang.String" />

        <variable
            name="list"
            type="ArrayList&lt;String>" />
        <!--泛型的支援會在編譯時期報紅線,但是是可以直接執行的
        但是需要通過轉義字元才行,如:&lt;資料型別> 或者&lt;資料型別&gt;-->

        <import type="java.util.Map" />

        <variable
            name="map"
            type="Map&lt;String,String&gt;" />

        <variable
            name="arrays"
            type="String[]" />
    </data>
    <!--我們需要展示的佈局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        <