DataBinding(上)

2017-12-20  本文已影响0人  YC1995

DataBinding的简单使用

概述

配置环境

首先打开module下的build.gradle,添加如下的代码片段

android {
    ....
    dataBinding {
        enabled = true
    }
}

定义Bean实体类

public class User {
    private final String firstName;
    private final String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

创建DataBinding布局文件
DataBinding布局文件是以<layout>标签作为根节点的,里面包含是两个子元素。一个<data>标签和一个view根节点的标签。
在layout文件夹下新建一个activity_main.xml文件,根节点设置为layout,如下是一个定义好的DataBinding布局文件

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

    <data>
        <variable
            name="user"
            type="com.example.chenyichao.databindingdemoproject.User" />
    </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.firstName}"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"/>
    </LinearLayout>
</layout>

<data>标签中使用<variable>标签定义布局中使用到的实体类的引用。接下来在用到的地方只需要使用@{}在花括号中即可使用<data>标签中定义的实体类引用。

绑定数据
Android Studio会自动生成Binding class,生成的类默认以xml布局的命名为基础。例如定义的xml文件名为activity_main.xml则会生成一个ActivityMainBinding类,接下来就可以使用该类进行数据的绑定了。
在Activity的onCreate()方法中使用生成的Binding类。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        User user = new User("Test","User");
        binding.setUser(user);
    } 

事件处理

public class UserHandlers {
    private static final String TAG = "UserHandlers";
    //注意此处的参数为View,与常用的在Activity中定义方法,在xml中配置onClick属性类似
    public void onClickFirstName(View view) {
        Log.d(TAG, "onClickFirstName: ");
        Toast.makeText(view.getContext(), "onClickFirstName", Toast.LENGTH_SHORT).show();
    }
}

修改activity_main.xml<data>标签中添加<variable>变量。

    <data>
        <variable
            name="user"
            type="com.example.chenyichao.databindingdemoproject.User" />
        <variable
            name="handlers"
            type="com.example.chenyichao.databindingdemoproject.UserHandlers"/>
    </data>

在控件中使用定义的变量的方法

<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@{user.lastName}"
     android:onClick="@{handlers::onClickFirstName}"/> 

最后,在onCreate()方法设置Handler

binding.setHandlers(new UserHandlers());
//定一个类
public class Presenter {
    private static final String TAG = "Presenter";

    public void onSaveClick(int a) {
        Log.d(TAG, "onSaveClick: " + a);
    }
}

xml<data>标签添加变量和view控件中使用方法

 <data>
       <variable name="presenter"
                 type="com.example.chenyichao.databindingdemoproject.Presenter"/>
 </data>
  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{user.lastName}"
      android:onClick="@{()->presenter.onSaveClick(1)}"/>

详解Layout

imports:<import>

<data>标签中使用<import>标签可以像Java一样导入使用到的类

<data>
<import type="android.view.View"/>
</data>

接下来就可以在view控件中使用View中的一些方法。

 <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{user.firstName}"
      android:visibility="@{user.adult?View.VISIBLE:View.GONE}"/>

variables:<variable>

<data>标签中可以定义多个<variable>标签。每个标签定义了一个属性,只有定义了该标签,在之后的view空间才能够使用dataBinding的表达式。

重命名Binding Class

<data class="UserBinding">

通过制定class属性就可以更改Binding Class的命名。

DataBinding表达式

DataBinding的表达式和Java的表达式基本相似。一些逻辑运算符,类的公有方法等都可以在DataBinding表达式中使用。举个例子:

android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"

以下四个是在DataBinding表达式中相较于Java表达式没有的:

DataBinding表达式特有的:
??
两个问好?没错。Null联合运算符是DataBinding中独有的运算符。是一个二目运算符,代表的含义是参与操作的左边的变量不为null则取左边的变量的值,左边为空则取右边的变量的值。

<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@{user.firstName??user.lastName}" />

自动避免空指针异常
DataBinding表达式会自动的检查为空的引用,并且自动的避免空指针异常。例如下面的例子

<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@{user.age}" />

如果user为null,age为int型,则会自动使用默认值0进行赋值。

集合类
使用集合类首先要在<data>标签中先导入

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

接着是定义变量

<data class="UserBinding">
     <import type="java.util.List"/>
     <variable
            name="list"
            type="List&lt;String&gt;"/>
</data>

tips:String左边和右边的两个东西是何物?其实是对<>的转义。简而言之一句话,&lt;代表<,&gt;代表>。
还有一个就是记得使用Binding Class进行数据的设置。

上一篇 下一篇

猜你喜欢

热点阅读