DataBinding(二):DataBinding的基本用法

Posted on 2018-06-04 08:38  xl_phoenix  阅读(307)  评论(0编辑  收藏  举报

转自:DataBinding系列(二):DataBinding的基本用法

1.在xml中引入一些基础变量Variables

data 标签中可以有任意数量的 variable 标签。这些变量可以使Java中的任意数据类型,每个 variable 标签描述了会在 binding 表达式中使用的属性。

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <variable  
            name="str"  
            type="String"/>  
        <variable  
            name="age"  
            type="int" />  
    </data>  

    <LinearLayout  
        android:orientation="vertical"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content">  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{str}"/>
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{String.valueOf(age)}"/>  
    </LinearLayout>  
</layout>

Data Binding和Java一样,java.lang包里的类,我们是可以不用导入包的,也就是说,java基础类型都是不用导包的。注意:android:text设置int类型的值一定要转化为String类型,否则系统会认为是资源文件id,就会出错*

2.引入一些高级变量Variables

在上面,我们学会了如何在xml中定义变量,以及在控件中使用。同样,我们可以在data中定义像List、Map,数组等这样的集合变量,只是它的实现稍微有点不同,下面就一起来看看是如何定义以及使用的。

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

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

        <!--泛型的支持会在编译时期报红线,但是是可以直接运行的
       但是需要通过转义字符才行,如:<号用&lt表示;>号用&gt表示;-->
       <variable
            name="list"
            type="List<String>" />

        <variable
            name="map"
            type="Map<String,Object>" />

        <variable
            name="array"
            type="String[]" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{list[0]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{list.get(1)}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@{map[`key0`]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{map.get(`key1`)}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@{array[0]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{array[1]}" />

    </LinearLayout>
</layout>   

大家可以看到,list和map这里我没有用List和Map<String,Object>,而是用的List和Map<String,Object>原因是在data中,有些字符是必须用转义字符才能编译通过,上面把<>换成转义字符的写法虽然会在编译时是红色的,但是不用担心,会编译通过的。

在Activity中初始化数据,设置这些变量

public class BasicActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityBasicBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_basic);

        List<String> list = new ArrayList<>();
        list.add("list1");
        list.add("list2");
        binding.setList(list);

        HashMap<String, Object> map = new HashMap<>();
        map.put("key0", "map_value0");
        map.put("key1", "map_value1");
        binding.setMap(map);
        
        String[] arrays = {"字符串1", "字符串2"};
        binding.setArray(arrays);
    }
}

3.xml中引用表达式

举几个例子,还有很多,大多数Java表达式都是支持的

android:text="@{String.valueOf(age)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:text='@{"iname:" +user.name}'

此外还支持null合并操作,它的符号是??,意思是:如果左边的对象非空则选择左边,否则选择右边,这和Java中的三目运算符是一样的,可以算是一个简略吧。

android:text="@{user.displayName ?? user.lastName}"
//等价于
android:text="@{user.displayName != null ? user.displayName : user.lastName}"

Copyright © 2024 xl_phoenix
Powered by .NET 9.0 on Kubernetes