Android开发(Kotlin) ViewModel基本用法示例详解
作者:归人云淡风轻
时间:2026-06-29
浏览:0
ViewModel基本用法 先来看一个最简单的例子。要创建一个ViewModel,其实并不复杂,直接继承一下ViewModel类就行了: class MyViewModel: ViewModel() { } 怎么让计数器跑起来?很简单,在ViewModel里加一个变量: class MyViewMo
ViewModel基本用法
先来看一个最简单的例子。要创建一个ViewModel,其实并不复杂,直接继承一下ViewModel类就行了:
class MyViewModel: ViewModel() {
}
怎么让计数器跑起来?很简单,在ViewModel里加一个变量:
class MyViewModel : ViewModel() {
var count = 0
}
到了Activity里,就需要通过ViewModelProvider来获取ViewModel的实例了。每点一次按钮,计数器加1:
override fun onCreate(sa vedInstanceState: Bundle?) {
super.onCreate(sa vedInstanceState)
enableEdgeToEdge()
binding = ActivityClickBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel = ViewModelProvider(this).get(MyViewModel::class.ja va)
binding.clickButC.setOnClickListener {
viewModel.count++
refreshCount()
}
refreshCount()
}
private fun refreshCount() {
binding.clickTvText.text = viewModel.count.toString()
}

有趣的是,即使旋转屏幕,刚才记下的计数值仍然安然无恙——ViewModel的生命周期比Activity更长。

向ViewModel传递参数
上面那个例子其实还有改进空间:如果退出程序再重新打开,数据怎么恢复?这时候就需要把之前保存的值传进ViewModel了。
先修改一下ViewModel,让它能接收一个初始计数值:
class MyViewModel(counter: Int) : ViewModel() {
var count = counter
}
这里的counter就是之前存下来的那个数值。接下来,得写一个ViewModelProvider.Factory,把数据通过构造函数传递给MyViewModel。核心是重写create方法:
class MyViewModelFactory(private val counter: Int) : ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
return MyViewModel(counter) as T
}
}
最后在Activity里,从SharedPreferences中取出之前保存的计数,再通过Factory创建ViewModel。同时,在onPause时把当前计数值存回去。
class ClickActivity : ComponentActivity() {
lateinit var viewModel: MyViewModel
lateinit var binding:ActivityClickBinding
lateinit var sp: SharedPreferences
override fun onCreate(sa vedInstanceState: Bundle?) {
super.onCreate(sa vedInstanceState)
enableEdgeToEdge()
binding = ActivityClickBinding.inflate(layoutInflater)
setContentView(binding.root)
sp = getSharedPreferences("data",MODE_PRIVATE)
val countSp = sp.getInt("count",0)
viewModel = ViewModelProvider(this, MyViewModelFactory(countSp)).get(MyViewModel::class.ja va)
binding.clickButC.setOnClickListener {
viewModel.count++
refreshCount()
}
refreshCount()
}
private fun refreshCount() {
binding.clickTvText.text = viewModel.count.toString()
}
override fun onPause() {
super.onPause()
sp.edit{
putInt("count",viewModel.count)
}
}
}
作者最新文章
荣耀MagicOS 11发布计划与Agent Harness架构解析
2026-09-08 19:23
AI重构企业业务架构:超聚变“智企”范式核心解析
2026-09-08 18:39
PDF合并工具怎么选?在线合并5步实操指南
2026-09-04 17:05
PDF图片压缩工具推荐与批量处理实操指南
2026-09-03 12:14
照片如何转成PDF格式?三种图片转PDF操作方法
2026-09-03 11:04
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































