DataBinding数据绑定入门篇

引言:

DataBinding是2015年谷歌I/O上提出来的,从字面意思上看就是数据绑定,实际上就是将数据绑定在xml中,并实现及时刷新,听起来就碉堡了,再也没有了findviewbyId,虽然现在很多注解框架也能实现无findviewbyId,但是这样会影响性能,带着好奇的心理今天来学一下DataBinding的使用

使用:

一,环境配置

使用android studio1.3以上版本,现在基本都升到2.2了吧

在gradle中添加

//在android{}里面添加
 dataBinding {
            enabled = true
        }

不需要对着官网那种添加方式,反正我添加了下载不成功,因为官方文档添加依赖并不是最新版本。

二,简单使用

2.1 布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto">

    <data>
        <variable  name="user" type="com.example.com.testdatabinding.User"/>
        <variable  name="myHandler" type="com.example.com.testdatabinding.MyHandlers"/>
    </data>

    <LinearLayout  android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" >

        <TextView  android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/>

        <TextView  android:id="@+id/tv_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.sex}"/>
        <ImageView  android:id="@+id/iv_head" android:layout_width="wrap_content" android:layout_height="wrap_content" bind:imageUrl="@{user.icon}" />
        <TextView  android:id="@+id/tv_move" android:layout_width="100dp" android:layout_height="48dp" android:gravity="center" android:layout_gravity="center_horizontal|bottom" android:text="点击跳转" android:onClick="@{myHandler.onClickView}" />

    </LinearLayout>
</layout>

上面是我demo中MainActivity对应的xml文件,可以看出跟普通布局的不同。

起始根布局为layout ,再也不是以前的ViewGroup,随后是<data>,和布局的根布局。

<data>里面可以使用import标签variable标签,二者是相同效果的不同实现方式。

方式1:

<import type="com.example.com.testdatabinding.User"/>
        <variable
            name="user"
            type="User"/>

方式2:

<variable
            name="user"
            type="com.example.com.testdatabinding.User"/>

赋值:

android:text="@{user.sex}"

采用@{变量名.属性名}格式,这里可以采用表达式支持,详细介绍以官方文档为例。可参考http://jcodecraeer.com/a/anzhuokaifa/developer/2015/0606/3005.html,现实项目中运用应该没有那么复杂,毕竟为了代码的可读性考虑也不该写那么复杂。

android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'

text是将index+1转型之后的String值,可见性,age小于13不可见,反之可见,这些大大简化了代码量,也在一定程度上提升了程序性能

点击事件:

<variable
            name="myHandler"
            type="com.example.com.testdatabinding.MyHandlers"/>

调用

android:onClick="@{myHandler.onClickView}"

MyHandlers 类

public class MyHandlers {

    public void onClickView(View view){
        Toast.makeText(view.getContext(),"绑定事件成功",Toast.LENGTH_SHORT).show();
    }
}

也可以直接在代码

binding.tvMove.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
        Toast.makeText(MainActivity.this,"我感受到点击了",Toast.LENGTH_LONG).show();
            }
        });

图片加载:

<ImageView
            android:id="@+id/iv_head"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            bind:imageUrl="@{user.icon}"
            />

bind:imageUrl这个属性需要我们自己创建

ImageLoadAdapteRSSs这个类型可以随意,并没有固定格式

public class ImageLoadAdapteRSSs {
    @BindingAdapter("bind:imageUrl")
    public static void bindImage( ImageView imageView,String url){
        Picasso.with(imageView.getContext()).load(url).into(imageView);
    }
}

* Activity中的代码 ———— *

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        User user=new User();
        user.setAge(12);
        user.setIcon("https://www.baidu.com/img/2016_10_09logo_61d59f1e74db0be41ffe1d31fb8edef3.png");
        user.setName("张三");
        user.setSex("男");
        ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setvariable(BR.user,user);
        binding.setMyHandler(new MyHandlers());
// binding.tvMove.setonClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// Toast.makeText(MainActivity.this,"我感受到点击了",Toast.LENGTH_LONG).show();
// }
// });
    }

binding.setvariable(BR.user,user); 设置绑定对象( binding.setUser(user);)
binding.setMyHandler(new MyHandlers()); 设置绑定点击事件

效果

可以看到赋值,加载图片,点击事件都有了效果

看看实体类怎么创建吧

package com.example.com.testdatabinding;

import android.databinding.BaSEObservable;
import android.databinding.Bindable;

/** * Created by Administrator on 2016/10/9. */

public class User extends BaSEObservable{
    private String name;
    private String sex;
    private int age;
    private String icon;

    @Bindable
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    @Bindable
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
        notifyPropertyChanged(BR.sex);
    }

    @Bindable
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        notifyPropertyChanged(BR.age);
    }

    @Bindable
    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
        notifyPropertyChanged(BR.icon);
    }
}

继承BaSEObservable类,BaSEObservable提供了一系列notify函数(其实就是notifyChange和notifyPropertyChanged),前者会刷新所有的值域,后者则只更新对应BR的flag,该BR的生成通过注释@Bindable生成,在上面的实例代码中,我们可以看到两个get方法被注释上了,所以我们可以通过BR访问到它们并进行特定属性改变的notify。(摘自阿布的解释)

跟recylerview差不多,可局部刷新,可全局刷新。

后续会继续学习DataBinding的使用。

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念