kotlin遇见DataBinding

417 阅读2分钟

互联网开发模式经历了MVC、MVP。Android本身的开发模式为MVC,前些年MVP大行其道,这两年MVVM逐渐开始流行,最近准备用kotlin开发一个项目,顺便了解一下MVVM。

我采用的Android studio版本如下,因为大家会在软件版本上出问题,所以特意给大家贴出来我的版本

首先、建立一个新的Android工程,开发语言选择kotlin,如下图所示

其次、修改工程下的

C:\kotlin\live\app\build.gradle


apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.xiangshike.live"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
    androidExtensions {
        experimental = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}


开启kotlin的支持

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'


开启dataBinding的支持

    dataBinding {
        enabled = true
    }

新建一个基类BaseActivity


package com.xiangshike.live.base

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding

abstract class BaseActivity<DB : ViewDataBinding> : AppCompatActivity() {
    lateinit var mDataBind: DB

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDataBind = DataBindingUtil.setContentView<DB>(this, getLayoutId())
        initData()
        initView()
    }

    abstract fun getLayoutId(): Int

    override fun onDestroy() {
        super.onDestroy()
        mDataBind.unbind()
    }

    abstract fun initData()
    abstract fun initView()
}

建立一个模型


package com.xiangshike.live.model

data class User(val name: String)

建立MainActivity继承BaseActivity


package com.xiangshike.live

import android.text.Editable
import android.text.TextWatcher
import com.xiangshike.live.base.BaseActivity
import com.xiangshike.live.databinding.ActivityMainBinding
import com.xiangshike.live.model.User
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : BaseActivity<ActivityMainBinding>() {
    private var user = User("hanyun")
    override fun getLayoutId(): Int = R.layout.activity_main
    override fun initData() {
        mDataBind.user = user
    }

    override fun initView() {
        editText.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                mDataBind.user = user.copy(name = editText.text.toString())
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }
        })
    }
}


在这里要强调一下 BaseActivity这里的ActivityMainBinding的写法,然后编译一下导入包

视图的名称转换为每个单词的首字母大写+Binding,例如activity_main.xml=>ActivityMainBinding

视图activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="com.xiangshike.live.model.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>


</layout>

其中,这里定义的变量名称user和MainActivity中mDataBind.user一致


        <variable
            name="user"
            type="com.xiangshike.live.model.User" />
            

这里的@{user.name}表示给模板赋值


        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />


最终的项目结构如下图

当我们修改了EditText的内容,TextView的内容也跟着改变了