什么是 ViewModel
ViewModel 是 Jetpack 中的一个组件,它旨在存储和管理与UI相关的数据,ViewModel 的设计思想是将 UI 层与业务逻辑分离,使得数据在配置更改(例如屏幕旋转) 时仍然保持可用。ViewModel 独立于 UI 层的生命周期,并在配置更改时保留其状态,因此可以轻松地处理生命周期感知的数据。
ViewModel 通常与 LiveData 结合使用,后者是一个可观察的数据容器,LiveData 使数据在 ViewModel 和 UI 之间进行双向绑定成为可能,从而使数据的更新可以自动反映在 UI 上。
build.gradle 增加 ktx 依赖
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
implementation 'androidx.core:core-ktx:1.2.0'
}
如何使用 ViewModel
MyViewModel
class MyViewModel :ViewModel(){
var num:Int = 0;
}
MainActivity 引用 ViewModel
class MainActivity : AppCompatActivity() {
/**
* ViewModel : 保存数据稳定性,横竖屏切换
*/
private lateinit var myViewModel: MyViewModel;
private var tvMsg: TextView? = null
private var testNum =0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tvMsg = findViewById(R.id.tvMsg)
myViewModel = ViewModelProvider(
this,
ViewModelProvider.NewInstanceFactory()
).get(MyViewModel::class.java)
tvMsg?.text = "累加:${myViewModel.num}"
// tvMsg?.text = "累加:${testNum}"
findViewById<Button>(R.id.btMsg).setOnClickListener {
tvMsg?.text = "累加:${++myViewModel.num}"
// tvMsg?.text = "累加:${++testNum}"
}
}
/*override fun onRetainCustomNonConfigurationInstance(): Any? {
return super.onRetainCustomNonConfigurationInstance()
}*/
}
activity_main 布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id = "@+id/btMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="点击我呗"/>
<TextView
android:id = "@+id/tvMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
参考: