使用前提:
在工程build.gradle工程模块中加入如下依赖:
dependencies {
...
implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
...
}
在安卓开发中ViewModel是专门用于储存和界面有关的数据,ViewModel 的生命周期独立于视图(如 Activity 或 Fragment)的生命周期,它可以保证在手机屏幕发生翻转时不会被重建。比较好的习惯是给每一个Activity和Fragment都创建一个对应的ViewModel类
一、创建布局文件
创建名为activity_main.xml的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="20dp"
android:text="0"
android:textSize="32sp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add the num"
android:id="@+id/AddNum"/>
</LinearLayout>
二、创建相应的ViewModel
为MainActivity创建一个对应的ViewModel类,并让他继承自ViewModel
package com.example.myapplicationtestexample
import androidx.lifecycle.ViewModel
class MainViewModel:ViewModel() {
var count = 0
}
三、使用ViewModel
package com.example.myapplicationtestexample
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.example.myapplicationtestexample.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel:MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//不可以直接创建,要用ViewModelProvider来获取ViewModel的实例
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.AddNum.setOnClickListener{
viewModel.count++
refreshNum()
}
//在这要重新刷新一次界面,不然会显示为0然后重新从ViewModel中读取数据
refreshNum()
}
private fun refreshNum() {
binding.info.text = viewModel.count.toString()
}
}
说明:这里使用了两次refreshNum方法
第一次:是为了让按钮被点击时及时更新按钮数据
第二次:是为了让让页面翻转时及时从ViewModel中更新数据,否则会出现翻转页面之后显示数字为0,在点击按钮之后才会更新为最新数字的情况