厚全 發表於 2025-11-20 10:10:25

Android开发(Kotlin) ViewModel基本用法示例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>ViewModel基本用法</li><li>向ViewModel传递参数</li></ul></div><p class="maodian"></p><h2>ViewModel基本用法</h2>
<p>创建viewmodel</p>
<div class="jb51code"><pre class="brush:java;">class MyViewModel: ViewModel() {
}</pre></div>
<p>实现一个计数器</p>
<div class="jb51code"><pre class="brush:java;">class MyViewModel : ViewModel() {
    var count = 0
}</pre></div>
<p>在activity使用ViewModel,获取ViewModel的实例需要通过ViewModelProvider。点击按钮一次计数器加1</p>
<div class="jb51code"><pre class="brush:java;">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()
    }</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025112010080161.png" /></p>
<p>旋转屏幕后,计数器的数据仍然存在</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025112010080169.png" /></p>
<p class="maodian"></p><h2>向ViewModel传递参数</h2>
<p>改进上面的例子,保证退出程序后,重新打开,数据任然存在。<br />修改viewmodel</p>
<div class="jb51code"><pre class="brush:java;">class MyViewModel(counter: Int) : ViewModel() {
    var count = counter
}</pre></div>
<p>counter记录之前保存的值<br />创建ViewModelProvider.Factory ,向MyViewModel的构造函数传递数据。添加构造函数,重写create方法,</p>
<div class="jb51code"><pre class="brush:java;">class MyViewModelFactory(private val counter: Int) : ViewModelProvider.Factory {
    override fun &lt;T : ViewModel&gt; create(modelClass: Class&lt;T&gt;): T {
      return MyViewModel(counter) as T
    }
}</pre></div>
<p>修改activity</p>
<div class="jb51code"><pre class="brush:java;">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)
      }
    }
}</pre></div>
<p>到此这篇关于Android开发(Kotlin) ViewModel基本用法的文章就介绍到这了,更多相关Android ViewModel用法内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Android Jetpack组件ViewModel基本用法详解</li><li>Android&nbsp;ViewModel与Lifecycles和LiveData组件用法详细讲解</li><li>Android学习总结之Java和kotlin区别超详细分析</li><li>Android开发Kotlin语言协程中的并发问题和互斥锁</li><li>Android开发Kotlin语言协程的依赖及使用示例</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Android开发(Kotlin) ViewModel基本用法示例详解