互联网开发模式经历了MVC、MVP。Android本身的开发模式为MVC,前些年MVP大行其道,这两年MVVM逐渐开始流行,最近准备用kotlin开发一个项目,顺便了解一下MVVM。
我采用的Android studio版本如下,因为大家会在软件版本上出问题,所以特意给大家贴出来我的版本
首先、建立一个新的Android工程,开发语言选择kotlin,如下图所示
其次、修改工程下的
C:kotlinliveappbuild.gradle
代码语言:javascript复制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的支持
代码语言:javascript复制apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-kapt'
开启dataBinding的支持
代码语言:javascript复制 dataBinding { enabled = true }
新建一个基类BaseActivity
代码语言:javascript复制package com.xiangshike.live.base
import android.os.Bundleimport androidx.appcompat.app.AppCompatActivityimport androidx.databinding.DataBindingUtilimport 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()}
建立一个模型
代码语言:javascript复制package com.xiangshike.live.model
data class User(val name: String)
建立MainActivity继承BaseActivity
代码语言:javascript复制package com.xiangshike.live
import android.text.Editableimport android.text.TextWatcherimport com.xiangshike.live.base.BaseActivityimport com.xiangshike.live.databinding.ActivityMainBindingimport com.xiangshike.live.model.Userimport 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
代码语言:javascript复制<?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一致
代码语言:javascript复制 <variable name="user" type="com.xiangshike.live.model.User" />
这里的@{user.name}表示给模板赋值
代码语言:javascript复制 <TextView android:id="@ id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{user.name}" />
最终的项目结构如下图
当我们修改了EditText的内容,TextView的内容也跟着改变了,从而实现数据绑定。