美文网首页
DataBinding(上)

DataBinding(上)

作者: YC1995 | 来源:发表于2017-12-20 22:21 被阅读0次

DataBinding的简单使用

概述

  • DataBinding是一个Support库,可以兼容到Android 2.1
  • 使用DataBinding需要将Gradle插件升级到1.5.0及以上并且Android Studio的版本在1.3以上

配置环境

首先打开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);
    } 

事件处理

  • Method References
    定义一个事件处理的类,里面有事件处理的方法
    Method Reference要求定义的方法参数列表与关联的属性要求的参数列表要一致。
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());
  • Listener Bindings
    相比于Method Reference,Listener Bindings有两个不同的点。一是不要求参数列表与xml属性要求的参数列表相同,只要求返回值类型相同即可。二是只有在事件触发的时候DataBinding才会创建并注册必要的监听器。
    简单示例
//定一个类
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表达式没有的:

  • this
  • super
  • new
  • 泛型<T>

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进行数据的设置。

相关文章

网友评论

      本文标题:DataBinding(上)

      本文链接:https://www.haomeiwen.com/subject/ukgnwxtx.html