Kotlin 语言 BindingAdapter 与 LiveData双向绑定

本文介绍了如何在Android项目中使用Kotlin的BindingAdapter实现与LiveData的双向数据绑定,包括环境编译配置、普通组件的双向绑定示例、自定义View的双向绑定方法,并针对编译时可能出现的SSLException问题提供了解决方案。详细代码可在相关资料链接中查看。
摘要由CSDN通过智能技术生成

环境编译配置

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,官方平台提供对双向数据绑定的内置支持

image-20220312163737020

所以常用的组件,可以通过@={}符号,实现数据的双向绑定,以下取个例子:

创建 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值