Android开发(Kotlin) ViewModel基本用法

ViewModel基本用法

创建viewmodel

kotlin 复制代码
class MyViewModel: ViewModel() {
}

实现一个计数器

kotlin 复制代码
class MyViewModel : ViewModel() {


    var count = 0
}

在activity使用ViewModel,获取ViewModel的实例需要通过ViewModelProvider。点击按钮一次计数器加1

kotlin 复制代码
  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        binding = ActivityClickBinding.inflate(layoutInflater)
        setContentView(binding.root)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        binding.clickButC.setOnClickListener {

            viewModel.count++
            refreshCount()

        }
        refreshCount()
    }

    private fun refreshCount() {

        binding.clickTvText.text = viewModel.count.toString()
    }

旋转屏幕后,计数器的数据仍然存在

向ViewModel传递参数

改进上面的例子,保证退出程序后,重新打开,数据任然存在。

修改viewmodel

kotlin 复制代码
class MyViewModel(counter: Int) : ViewModel() {


    var count = counter
}

counter记录之前保存的值

创建ViewModelProvider.Factory ,向MyViewModel的构造函数传递数据。添加构造函数,重写create方法,

kotlin 复制代码
class MyViewModelFactory(private val counter: Int) : ViewModelProvider.Factory {


    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MyViewModel(counter) as T
    }

}

修改activity

kotlin 复制代码
class ClickActivity : ComponentActivity() {


    lateinit var viewModel: MyViewModel
    lateinit var binding:ActivityClickBinding
    lateinit var sp: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        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.java)
        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)
        }
    }

}
相关推荐
jack186891 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
jimy11 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码2 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
kimnoic2 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php
_Evan_Yao2 小时前
前后端联调怎么排查问题?从 Network 到后端日志,一步步定位错误
开发语言·后端·团队开发·需求分析
hudd6682 小时前
JavaEE 初阶 - 多线程(进阶)
java·开发语言·java-ee
小白快快跑哦3 小时前
python-字符串全解(六):正则表达式-前后相断言
开发语言·python·正则表达式·前后相断言
kimnoic3 小时前
Python数据分析中正则表达式匹配字符串与常用函数示例详解
开发语言·python
中屹指纹浏览器svip3 小时前
打开账号环境网页报错,常见原因有哪些?
服务器·开发语言·php·中屹指纹浏览器
朝朝辞暮i3 小时前
第 01 讲:Python 变量、对象、数据类型与内存引用
开发语言·python