Android databinding的使用

在之前没有使用databinding的时候,总是感觉databinding的实现很神奇所以一直没有敢去触碰这一块,还是按照很老的方式去写,习惯新setContentView,然后findViewById,然后挨个赋值,挨个view设置点击事件,这样写很繁琐也容易丟落内容,今天狠下心来初步研究了一番databinding,现在来总结一下。

  1. 首先是databinding在工程内的引入

    引入其实很简单,在你要使用databinding的moudle的gradle文件直接添加如下代码

android {
    ...

    dataBinding {
        enabled = true
    }
}

可以很明显看出来dataBinding的相关设置,相信在这里不细说大家应该也可以看明白。

  1. databinding的布局应该怎么写呢?我们来一起看一下,我写了一个简单的例子
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
                name="data"
                type="com.lmm.fragmentscreenrotate.activity.StartActivity.DataModel"/>
    </data>

    <LinearLayout

            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".activity.StartActivity"
            android:orientation="vertical">

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

        <Button
                android:id="@+id/test"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/button_test"
                android:onClick="@{()->data.onClickTest()}"
                />

        <Button
                android:id="@+id/back_stack_test"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{()->data.onClickBackStackTest()}"
                android:text="@string/button_test_back_stack"/>
    </LinearLayout>
</layout>

以上是示例中的layout布局文件,可以很明白的看出来这个布局和普通布局不一样的地方,在最外层包了layout这样一层说明这个layout使用databinding,再看data这个标签就是我们做数据定义的部分,用于数据绑定使用,然后就是下面普通的布局部分,当然在赋值或点击事件部分大家会看到类似如下代码

"@{这里是数据绑定内容部分代码}"

在这个大括号可以指定对应数据或在onClick部分指定点击事件要调用的方法,可能只这样说不太好明白,我把这个数据绑定类在下面贴出来

package com.lmm.fragmentscreenrotate.activity

import android.content.Context
import android.content.Intent
import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.lmm.fragmentscreenrotate.R
import com.lmm.fragmentscreenrotate.databinding.ActivityStartBinding

class StartActivity : AppCompatActivity() {

    private var mDataBinding:ActivityStartBinding? = null
    private var mDataModel:DataModel? = DataModel(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_start)

        mDataModel?.title = "这是测试databinding"


        mDataBinding?.data = mDataModel
//        mDataBinding?.test?.setOnClickListener {
//            val intent = Intent(this, MainActivity::class.java)
//            startActivity(intent)
//        }
//
//        mDataBinding?.backStackTest?.setOnClickListener {
//            val intent = Intent(this, BackStackTestActivity::class.java)
//            startActivity(intent)
//        }
    }

    class DataModel(context: Context) {

        private var mContext:Context? = null
        var title:String = ""

        init {
            mContext = context
        }

        fun onClickTest() {
            val intent = Intent(mContext, MainActivity::class.java)
            mContext?.startActivity(intent)
        }

        fun onClickBackStackTest() {
            val intent = Intent(mContext, BackStackTestActivity::class.java)
            mContext?.startActivity(intent)
        }
    }
}

整个activity都贴出来了,相信结合layout来看应该会更好理解了,我采用的是kotlin语言来写的这个demo,如果你对kotlin还不是很熟悉可以先去了解一下它。
其实databinging就是将定义好的值和事件直接同意通过双向绑定绑定到一起,这里没有体现view数据再次绑定到class,也许在下一个demo会有补充。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x