环境编译配置
AndroidStudio 2021.1.1
Gradle:gradle-7.1.2-bin.zip
创建一个项目
项目的build.gradle配置:
dependencies {
//重要配置
classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
}
App module build.gradle配置
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
//...... 重要配置
dataBinding {
enabled true
}
}
dependencies {
//...... 重要配置
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}
普通双向绑定
普通的组件,例如TextView、EditText,官方平台提供对双向数据绑定的内置支持
所以常用的组件,可以通过@={}
符号,实现数据的双向绑定,以下取个例子:
创建 MainViewModel
/***
* UI View Model
*/
class MainViewModel : ViewModel() {
/***
* 用户名,监听EditText的输入,以及修改EditText的值,达到双向数据通信
*/
val mUserNameMD = MutableLiveData("")
/***
* 密码
*/
val mUserPasswdMD = MutableLiveData("")
}
MainActivity
代码如下:
class MainActivity : AppCompatActivity() {
private val mState: MainViewModel by lazy {
ViewModelProvider(this).get(MainViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main
)
binding.vm = mState //设置ViewModeL
binding.click = OnCLickProxy() //点击按钮监听
binding.lifecycleOwner = this //一定要加上这句话,否则UI不会刷新
observe()
}
private fun observe() {
//监听输入用户名时,是否会同步更新值至 ViewModel
mState.mUserNameMD.observe(this) {
Log.i(MainActivity::class.java.simpleName, "UserName: $it")
}
//监听输入密码时,是否会同步更新值至 ViewModel
mState.mUserPasswdMD.observe(this) {
Log.i(MainActivity::class.java.simpleName, "UserPasswd: $it")
}
}
inner class OnCLickProxy {
fun onSubmit() {
//点击按钮后,获取输入框的值
Log.i(MainActivity::class.java.simpleName, "取值, UserName: ${
mState.mUserNameMD.value}, UserPasswd: ${
mState.mUserPasswdMD.value}")
//点击按钮后,修改输入框的值,观察输入框是否有变化
mState.mUserNameMD.postValue("张三")
mState.mUserPasswdMD.postValue("123")
}
}
}
activity_main
代码如下
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.example.databinding.MainViewModel" />
<variable
name="click"
type="com.example.databinding.MainActivity.OnCLickProxy" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="40dip"
tools:context=".MainActivity">
<TextView
android:id