ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续存在。
简而言之一句话就是:
让Activity管界面,ViewModel管数据,且在翻转屏幕或者改变系统语言时数据不丢失
创建一个新的项目,新版AS是默认使用Androidx的,旧版需要手动勾选
设置一个文本框,两个按钮(分别为+1,-1),通过点击按钮,实现文本框内容的数字加减操作。
在包名处创建一个类,名为NumberViewModel,继承ViewModel类
并在ViewModel中管理我们将要操作的数字,并声明为public
package com.example.viewmodeldemo;
import androidx.lifecycle.ViewModel;
public class NumberViewModel extends ViewModel {
public int number;
}
此处发现一个问题——新版的jetpack已经将ViewModelProviders弃用!
numberViewModel = ViewModelProviders.of(this).get(NumberViewModel.class);
因此查阅开发者文档查找新的方法,功夫不负有心人,查到新版使用方法
dependencies {
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
}
numberViewModel = new ViewModelProvider(this).get(NumberViewModel.class);
此处粘贴全部代码
package com.example.viewmodeldemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
NumberViewModel numberViewModel;
TextView textView_showNumber;
Button button_add,button_minus
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
numberViewModel = new ViewModelProvider(this).get(NumberViewModel.class);
textView_showNumber = findViewById(R.id.textView_showNumber);
button_add = findViewById(R.id.button_add);
button_minus = findViewById(R.id.button_minus);
textView_showNumber.setText(String.valueOf(numberViewModel.number)); //onCreate()时显示界面数字
button_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
numberViewModel.number++; //+1
textView_showNumber.setText(String.valueOf(numberViewModel.number));//刷新界面
}
});
button_minus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
numberViewModel.number--; //-1
textView_showNumber.setText(String.valueOf(numberViewModel.number));//刷新界面
}
});
}
}
翻转屏幕后数据也不会消除