AAC---DataBinding使用

DataBinding介绍

DataBinding类似于ButterKnife,可以将数据结构与XML绑定,节省了很多Activity中UI的代码,比如说findViewById等。也可以提升APP性能,帮助避免内存泄露以及空指针的问题。

DataBinding的使用

  1. app模块的build.gradle中添加DataBinding配置:
android {
    ...
    dataBinding {
        enabled = true
    }
}
  1. 定义XML对应的数据结构
package com.example.aactest;

public class Data {
    private String name;
    private String title;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
  1. 创建layout.xml文件(如activity_main.xml): 与原来的XML文件不同的是,根节点的为layout,而不是具体的ViewGroup。并且将与该xml绑定的数据需要在data标签中定义,并且在下方的View中将属性与子View绑定。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="com.example.aactest.Data" />
        <variable
            name="aacdata"
            type="com.example.aactest.Data" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{aacdata.name}" />
    </android.support.constraint.ConstraintLayout>
</layout>
  1. 编译完成后,在/app/build/generated/source/apt/debug下会新增一个packagename.databinding的文件夹,并且根据layout.xml编译生成的文件,而该文件名就是xml对应的名称。

比如:包名为com.example.aactest的应用,在上述目录下会生成com.example.aactest.databinding的文件夹,而activity_main.xml就会生成ActivityMainBinding.java文件

  1. 使用DataBinding绑定具体数据 在生成的ActivityMainBinding文件中,就会有数据部分的setget方法,在调用完set方法更新完Binding中的数据后,对应的View也会更新。
public class MainActivity extends AppCompatActivity {
    ActivityMainBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        final Data data=new Data();
        data.setTitle("This is Title");
        data.setName("This is User Name");
        mBinding.setTd(data);
        Handler handler = new Handler(new Handler.Callback() {
            @Override public boolean handleMessage(Message message) {
                data.setTitle("Change Title");
                mBinding.setTd(data);
                return false;
            }
        });
        handler.sendEmptyMessageDelayed(1, 5000L);
    }
}

DataBinding在RecyclerView中的使用

同在RecyclerView中的Item也可以使用DataBinding,在onCreateViewHolder中保存生成的Binding对象,在复用时,更新数据即可。并且可以在XML中设置ClickListener等事件。

RecyclerView的product_item.xml文件如下:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="product"
                  type="com.example.android.persistence.model.Product"/>
        <variable name="callback"
                  type="com.example.android.persistence.ui.ProductClickCallback"/>
    </data>

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="@dimen/product_item_min_height"
        android:onClick="@{() ->  callback.onClick(product)}"
        android:orientation="horizontal"
        android:layout_marginStart="@dimen/item_horizontal_margin"
        android:layout_marginEnd="@dimen/item_horizontal_margin"
        app:cardUseCompatPadding="true">

            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/cd_product_name"
                android:text="@{product.name}"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_marginEnd="5dp"
                android:text="@{@string/product_price(product.price)}"/>

    </android.support.v7.widget.CardView>
</layout>

RecyclerAdapter中部分内容如下:

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ProductItemBinding binding = DataBindingUtil
                .inflate(LayoutInflater.from(parent.getContext()), R.layout.product_item,
                        parent, false);
        binding.setCallback(mProductClickCallback);
        return new ProductViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(ProductViewHolder holder, int position) {
        holder.binding.setProduct(mProductList.get(position));
        holder.binding.executePendingBindings();
    }

    static class ProductViewHolder extends RecyclerView.ViewHolder {

        final ProductItemBinding binding;

        public ProductViewHolder(ProductItemBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }    

PS:在使用RecyclerView的时候,经常配合DiffUtil来进行数据的增量更新操作

注意事项

  • 在使用数据的时候,属性必须是public或者提供了settergetter方法,否则编译不过,无法生成Binding文件
  • XML文件中禁止使用merge标签,可以使用include标签,但是需要将变量传过去,否则数据无法传递。例如:
product_fragment.xml
...
<include
            layout="@layout/product_item"
            app:product="@{productViewModel.product}"/>
...

product_item.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="product"
                  type="com.example.android.persistence.model.Product"/>
        <variable name="callback"
                  type="com.example.android.persistence.ui.ProductClickCallback"/>
    </data>
...

参考链接

Data Binding Library DataBinding最全使用说明

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏7号代码

Android网络与数据存储——File存储(实现SD卡文件浏览器)

AndroidManifest.xml中manifest标签下有一个属性android:installLocation,用于指定应用程序安装在什么地方,该属性有...

31430
来自专栏分享达人秀

Activity初入门,创建和配置如此简单

Activity是Android应用的重要组成单元之一,也是Android应用最常见的组件之一。前面看到的示例通常都只包含一个Activity或一个Ap...

22650
来自专栏Java学习网

Android动态修改ListView中指定Item的组件属性

Android动态修改ListView中指定Item的组件属性 在Android实际开发过程中经常会遇到,修改ListView中某一项的值。如何达到这一目的...

65180
来自专栏分享达人秀

Fragment回退栈及弹出方法

在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习。 一、回退栈 在前面两...

37360
来自专栏码农笔录

Android全能开源项目xUtils3开发教程、简单封装

19820
来自专栏指尖下的Android

菜鸡的MVP架构漫谈

相信大家在网上看过关于MVP架构的博客数不胜数,至于MVP到底是什么,也不需要我再从百度百科复制一遍了,通俗的说MVP就是解决Model和View的耦合,没有使...

10120
来自专栏编码前线

在Android Studio中自定义代码模板

实例:EmptyActivity\root\src\app_package\SimpleActivity.java.ftl

26820
来自专栏向治洪

安全退出app,activoty栈管理

前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文。(之前看小强也写过一篇,这...

341100
来自专栏Android小菜鸡

Context的一点理解

  Content即上下文对象,在我们android开发中随处可见,并不陌生。在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创...

9440
来自专栏世界第一语言是java

Android全能开源项目xUtils3开发教程、简单封装

25040

扫码关注云+社区

领取腾讯云代金券