【Android】Jetpack中的ViewModel:自动保存页面数据

ViewModel

简介

  ViewModel 允许数据在配置更改(如屏幕旋转)后仍然存在,使用 ViewModel 可以免去开发者花费大量时间精力处理Activity生命周期变化导致的数据刷新重建后的恢复问题。
  我们使用创建工程时,系统自动为我们添加的Text组件作为示范。

ViewModel的使用方法

Step 1:创建ViewModel类

  在当前工程文件app -> java -> com.example.name层级上,右键new,选择java class。输入类名称,在super class一栏填写 androidx.lifecycle.ViewModel,点击OK完成创建。
  如图:
在这里插入图片描述

Step 2:编写ViewModel类内容(包括变量、方法等)

  接下来在ViewModel类中,实现对组件UI数据的控制。我们设置一个number变量作为Text组件的值。设置ClickText方法在用户点击Text组件的时候,实现其数值加一。

/* ViewModelTest 中的内容 */
package com.hello.livedata;
import androidx.lifecycle.ViewModel;

public class ViewModelTest extends ViewModel {
    private int number=0;

    /* getNumber方法返回private变量number的值 */
    public int getNumber() {
        return number;
    }
    /* getNumber方法返回private变量number+1的值 */
    public int numberPlus() {
        number++;
        return number;
    }
}

Step 3:在Activity中进行ViewModel绑定,以及控制

  在此之前,需要进入activity_main.xml 界面,单击design页面的hello world的Textview,为其设置ID。如图:
在这里插入图片描述
  设置完TextView组件的ID值后,就可以通过MainActivity.java文件绑定ViewModel并进行控制。

package com.hello.livedata;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;  /* 引入ViewModelProviders类,并单击红色部分文字后
                                                  点击左边出现的红色小灯泡选择引入依赖 */

public class MainActivity extends AppCompatActivity {
    ViewModelTest myViewModel; /* 新建ViewModel的实例*/
    TextView textView;          /* 新建textView实例*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      	  /* 在onCreate中,将myViewModel与class绑定 */
        myViewModel = ViewModelProviders.of(this).get(ViewModelTest.class);
      	  /* 将textView实例通过ID与activity_main.xml中的组件绑定 */
        textView = findViewById(R.id.textview01);
     	  /* 当Activity的生命周期改变,如因屏幕旋转而导致的重建时,直接读取ViewModel中的数据传送给组件*/
        textView.setText(String.valueOf(myViewModel.getNumber()));
       	  /* 为textView设置监听器,当单击时,触发ViewModel中的方法改变TextView值 */
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText(String.valueOf(myViewModel.numberPlus()));
            }
        });
    }
}

Step 4:运行

  使用Shift+F10在模拟器中运行程序,得到设想的结果。如下图所示,即使屏幕旋转,数据依旧可以通过ViewModel非常便捷地恢复。

在这里插入图片描述

posted @ 2019-07-26 15:35  耶夜夜夜  阅读(1331)  评论(0编辑  收藏  举报