在之前没有使用databinding的时候,总是感觉databinding的实现很神奇所以一直没有敢去触碰这一块,还是按照很老的方式去写,习惯新setContentView,然后findViewById,然后挨个赋值,挨个view设置点击事件,这样写很繁琐也容易丟落内容,今天狠下心来初步研究了一番databinding,现在来总结一下。
- 首先是databinding在工程内的引入
引入其实很简单,在你要使用databinding的moudle的gradle文件直接添加如下代码
android {
...
dataBinding {
enabled = true
}
}
可以很明显看出来dataBinding的相关设置,相信在这里不细说大家应该也可以看明白。
- 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会有补充。