## 序言
在正常情况下,旋转屏幕或切换系统语言,都会导致`Activity`被销毁,这样页面上原本的数据就会丢失。
ViewModelProvider可以用来保存页面上的数据,但存在一些小问题(我的小问题)。
## 环境
IDEA2020.3.3 社区版
java version "1.8.0_271"
Android SDK 7.0 (API24)
项目模板 Empty Activity
## 代码
MyViewModel
```java
package com.example.viewmodel;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
public int number = 0;
}
```
MainActivity
```java
package com.example.viewmodel;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProvider;
public class MainActivity extends AppCompatActivity {
private MyViewModel myViewModel;
private TextView textView;
private Button button1, button2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(MyViewModel.class);
textView = findViewById(R.id.textView);
textView.setText(String.valueOf(myViewModel.number));
button1 = findViewById(R.id.button);
button2 = findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.number++;
textView.setText(String.valueOf(myViewModel.number));
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.number += 2;
textView.setText(String.valueOf(myViewModel.number));
}
});
}
}
```
## 界面展示
![Screenshot_1616059763.png](https://i.loli.net/2021/03/18/bUQWOLdpegGukSI.png)
## 坑
在使用IDEA创建项目时,并没有androidx的选项,而看的教学视频是有的,想着可能是新版会自动引入就finish了,在编写代码时发现确实有`ViewModelProvider`这个类。
<br/>
尝试过使用以下两种方式创建`MyViewModel`的实例
```java
myViewModel = new ViewModelProvider.NewInstanceFactory().create(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(MyViewModel.class);
```
虽然能正常创建,但都无法让ViewModelProvider保存数据。
<br/>
根据视频导入了`Android Lifecycle ViewModel`
build.gradle(app下的)
```gradle
// ...
dependencies {
// ...
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.0'
}
```
再使用上面的两种方式,依旧无法保存数据。
<br/>
于是开始尝试使用弹幕中提到的写法来创建`MyViewModel`的实例。尝试过使用以下三种写法,都可以保存数据。
```java
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
```
虽然视频中有讲到按下返回键也能保存,但却未进行演示,个人实验是无法保存的。
视频链接: https://www.bilibili.com/video/BV1w4411t7UQ
[学习,记录] ViewModelProvider