Android开发(Kotlin) ViewModel基本用法示例详解
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)
}
}
}
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















