Android官方框架DataBinding

前言

DataBinding原来已经出来很久了,居然现在才开始学习,真是惭愧的很的!首先感谢,Android同行们的无私分享,使得学习资源的取得变得更加容易。
以前我们可以在layout.xml文件中写布局(控件),通过DataBinding就可以实现在写布局的同时进行赋值了。DataBinding把xml文件分为了布局部分和数据部分。

优秀教程

先推荐几篇优秀的教程
Android官方数据绑定框架DataBinding(一)
这篇文章,我看完了,总的来说,对于入门者是极好的。另外,在文章的下面还有demo供下载,在此向作者的无私,致敬。

Android官方数据绑定框架DataBinding(二)看了第二篇,更感觉DataBinding真是面面俱到,无论是普通的activity布局还是fragment布局,再到适配器,DataBinding的数据转换,倍感很有效率。

Android官方数据绑定框架Data Binding 指南

由于官方对DataBinding的使用是不断升级的,所以本文还是很有必要的。关于DataBinding的使用,这里一步步展开

DataBinding的环境配置

由于DataBinding是以支持包的形式对数据绑定进行支持的,因此有很好的兼容性。
The Data Binding Library offers both flexibility and broad compatibility — it’s a support library, so you can use it with all Android platform versions back to Android 2.1 (API level 7+).

To use data binding, Android Plugin for Gradle 1.5.0-alpha1 or higher is required

支持Android2.1(api7)及以上版本,使用data binding要求Android gradle插件的版本是1.5.0以上。
android studio 的最低版本是1.3。
另外更正一点的是,不同于以上推荐的文章一介绍的,此处配置只需:

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

然后你就可以使用data binding了。
另外还有一点需要说明的是,如果你的moudle引用了使用了data binding的library,此时你的moudle也需要进行以上配置。
用于验证本文代码的编译环境如下:Android studio 2.1.2 classpath 'com.android.tools.build:gradle:1.5.0'

第一个简单的实例

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <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>

layout标签下的子标签<variable>用于定义下方布局控件绑定的数据。而lastName同user.getLastName()。这有点类似于groovy的语言风格,默认为变量定义一个get,set方法。另外在引用时需要使用@另附加{}此处的user是一个javabean类。可以以如下之一的形式进行实现:

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

另一种

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 this.firstName;
   }
   public String getLastName() {
       return this.lastName;
   }
}

数据绑定

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

此处的类MainActivityBinding是自动生成的,命名规则如:layout布局文件名称顺序以下划线分隔出的单词 首字母大写+Binding组合而成。
另外一个可选的方案是:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater(),R.layout.main_activity, ((ViewGroup) getWindow().getDecorView()),true);

事件处理

事件索引

例如有如下方法:

public class MyHandlers {
    public void onClickFriend(View view) { ... }
}

你可以将该方法·onClickFriend()与控件的onClick相关联。
关联方式:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.Handlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

这里引用方法使用双冒号::有点类似于c++的味道。

将数据与Listener进行绑定

假如定义了如下监听:

public class Presenter {
    public void onSaveClick(Task task){}
}

布局中的引用

  <?xml version="1.0" encoding="utf-8"?>
  <layout xmlns:android="http://schemas.android.com/apk/res/android">
      <data>
          <variable name="task" type="com.android.example.Task" />
          <variable name="presenter" type="com.android.example.Presenter" />
      </data>
      <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
          <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
          android:onClick="@{() -> presenter.onSaveClick(task)}" />
      </LinearLayout>
  </layout>

这里的引用使用lambada表达式。如果onClick(View view)的view对开发者无用,此处可以省略不写。
以上等同于:

  android:onClick="@{(view) -> presenter.onSaveClick(task)}"

如果你的事件中对view有使用,可以用如下方式:

public class Presenter {
    public void onSaveClick(View view, Task task){}
}
  android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

为了避免复合监听(就是一个控件多个监听,容易混淆),此时定义了多个属性:

ClassListener SetterAttribute
SearchViewsetOnSearchClickListener(View.OnClickListener)android:onSearchClick
ZoomControlssetOnZoomInClickListener(View.OnClickListener)android:onZoomIn
ZoomControlssetOnZoomOutClickListener(View.OnClickListener)android:onZoomOut

如何访问控件的问题

首先你需要给控件设定id,然后DataBinding框架将会在生成的binding类中生成一个以id名命名的空间名。不过下划线省略了。例如:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

这是在MainActivityBinding中会生成两个常量:

public final TextView firstName;
public final TextView lastName;

后记

DataBinding还有例如数据观察,导包,方法重命名等一些知识,在以上推荐的两篇文章中都有所涉及。这里就不在重复了。

另外,不要忘了根本:关于DataBinding的官方文档
如有新的学习体会,后续补充·····


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值