【Android笔记】——DataBinding的基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012198209/article/details/80961660

    DataBinding是android官方提供的一个用于将layout和程序进行绑定的工具,使用DataBinding可以轻松地操作layout中的某个控件,如动态改变控件显示的文本,为控件绑定监听事件。不需要每次再通过findViewById方法去获取View,这样一来可以大大减少程序的代码总量,提高代码的可读性。

    本文介绍DataBinding的基本使用

1.绑定一个基本控件

    DataBinding是一个support library,所以它可以支持所有的android sdk,最低可以到android2.1(API7)使用DataBinding需要Android Gradle插件的支持,版本至少在1.5以上,需要的Android studio的版本在1.3以上。

    在Android Studio上使用,需要在module级别的build.gradle上添加对DataBinding的支持,直接在android闭包中添加:

android {
    dataBinding {
        enabled = true
    }
}

    使用了DataBinding的layout布局文件的结构和一般的布局文件有所不同,需要遵循规定的布局结构如下:

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

    其中<data>标签下的内容指定一个要绑定的数据的类型和它的名称,这个类型可以是基本类型也可以是我们自己创建的Java类。而在布局文件xml中通过@{...}的方式实现对于这个变量的绑定或者引用。下面介绍各种情况下的DataBinding绑定。

    首先在LinearLayout中建立一个基本的Button控件如下:

<Button
    android:id="@+id/mDataBinding"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Button" />

    activity中的代码如下所示:

public class DataBindingActivity extends BaseActivity {

    private ActivityDataBindingBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(DataBindingActivity.this,
 R.layout.activity_data_binding);
    }
    public void onClick(View view){
        int id = view.getId();
        switch(id){
            case R.id.mDataBinding:
                binding.mDataBinding.setText("没有使用findViewById绑定按钮");
                break;
        }
    }
}

    如果我们在layout中遵循了DataBinding的标准形式,那么当我们将Activity创建好时,会自动生成一个名为ActivityXXXBinding的类,我们可以使用这个Binding类来完成一系列的DataBinding操作。首先我们创建一个Binding实例,然后调用DataBindingUtil.setContentView()方法为Binding对象绑定layout。当我们要对Layout中的其他控件进行操作时,都只需要通过Binding提供的方法,而不用每次都使用findViewById()来获取控件了。

    这里为上面创建的Button绑定一个监听事件用来响应按钮的点击,可以看到,我们并不需要像传统方法中那样使用button.setOnClickListener(),只需定义一个onClick方法,再到layout中添加一个<data>节点,在节点内部添加<variable>标签,其中type表示这个节点所绑定对象的类型。在xml文件中可以通过@{xxx}的方式来调用data。

<data>
        <variable
            name="jump"
            type="com.guazi.android.hostler.activity.DataBindingActivity" />
</data>

    这里为名为jump的变量绑定了DataBindingActivity,这样一来jump就可以在xml中调用DataBindingActivity中的方法啦,比如为按钮设置点击响应,在Button中添加onClick属性:

android:onClick="@{jump::onClick}"

    运行程序,点击按钮后响应函数生效,说明按钮和Activity绑定成功。

2.绑定XML中的Variable变量

在<data>中添加两个变量

<variable
            name="content"
            type="String"/>
<variable
            name="enable"
            type="boolean"/>

在Button控件中我们就可以调用这两个变量的值

<Button
            android:id="@+id/mDataBinding1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{jump::onClick}"
            android:clickable="@{enable}"
            android:text="@{content}" />

再回到Activity中,由于我们已经建立了该layout布局与binding对象的绑定,我们就可以直接通过binding.setXXX动态的去改变还是那个面两个变量的值

binding.setContent("直接为button设置内容");
//按钮可点击
binding.setEnable(true);

3.实体类绑定和事件绑定

<variable
            name="userInfo"
            type="com.example.model.UserInfo"/>
<variable
            name="eventListener"
            type="com.example.model.EventListener"/>
<Button
            android:id="@+id/mDataBinding2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{jump::onClick}"
            android:text="@{userInfo.name+userInfo.age}" />

<Button
            android:id="@+id/mDataBinding3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{eventListener.click1}"
            android:text="@{title1}" />

在Activity的onCreate()内添加如下代码:

UserInfo userInfo = new UserInfo("OceaNier", 10);
binding.setUserInfo(userInfo);

binding.setEventListener(new EventListener() {
            @Override
            public void click1(View v) {
                binding.setTitle1("aaaaaaaaa");
            }
});

4.绑定适配器

在ListView的适配器中使用DataBinding

public class MyListViewAdapter<T> extends BaseAdapter {
    private LayoutInflater inflater;
    private int layoutId;
    private int variableId;
    private List<T> list;

    public MyListViewAdapter(Context context, int layoutId, List<T> list, int resId) {
        this.layoutId = layoutId;
        this.list = list;
        this.variableId = resId;
        inflater = LayoutInflater.from(context);
    }

    @Override

    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewDataBinding dataBinding;
        if (convertView == null) {
            dataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        } else {
            dataBinding = DataBindingUtil.getBinding(convertView);
        }
        dataBinding.setVariable(variableId, list.get(position));
        return dataBinding.getRoot();
    }
}

PS:在RecyclerView中使用DataBinding绑定适配器的方法和在ListView中相似。

5.其他

    另外DataBinding还能用来实现自定义属性、代码调用、数据刷新、数据调用等等功能,由于目前没有用到在此不做深入探讨。

猜你喜欢

转载自blog.csdn.net/u012198209/article/details/80961660