kotlin中加入MVVM思想
1.配置
//外部工程配置build.gradle
buildscript {
ext.kotlin_version = '1.3.41'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
//内部配置build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
......
dataBinding {
enabled true
}
}
kapt {
generateStubs = true
}
dependencies {
......
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
2.代码实现
2.1 M
data class Animal(val name: String, var shoutCount: Int)
2.2 V
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<!--需要的viewModel,通过mBinding.vm=mViewMode注入-->
<variable
name="vm"
type="com.example.myapplication.AnimalViewModel"/>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myapplication.AnimalActivity">
<TextView
android:id="@+id/info_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.info}"
tools:text="dog1叫了1声.."
android:layout_marginBottom="24dp"
android:layout_gravity="center"/>
<Button
android:id="@+id/action_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="shout"
android:layout_marginTop="24dp"
android:layout_gravity="center"
android:onClick="@{()->vm.shout()}"/>
</FrameLayout>
</layout>
2.3 VM
class AnimalViewModel(val animal: Animal) {
val info = ObservableField("${animal.name} 叫了 ${animal.shoutCount}声..")
fun shout() {
animal.shoutCount++
info.set("${animal.name} 叫了 ${animal.shoutCount}声..")
}
}
2.4 绑定
class AnimalActivity : AppCompatActivity() {
lateinit var mBinding: AnimalActivityBinding
lateinit var mViewMode: AnimalViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.animal_activity)
//model
val animal = Animal("dog", 0)
/ViewModel
mViewMode = AnimalViewModel(animal)
binding
mBinding.vm = mViewMode
}
}