【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非常便捷地恢复。
【Android】Jetpack中的ViewModel:自动保存页面数据的更多相关文章
- Charles自动保存响应数据
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 操作环境 win10 nexus5x c ...
- 【React】377- 实现 React 中的状态自动保存
点击上方"前端自习课"关注,学习起来~ 作者:陈俊宇 https://github.com/CJY0208 什么是状态保存? 假设有下述场景: 移动端中,用户访问了一个列表页,上拉 ...
- android项目中配置NDK自动编译生成so文件
1 下载ndk开发包 2 在android 项目中配置编译器(以HelloJni项目为例) 2.1 创建builer (a)Project->Properties->Builder ...
- 保存页面数据的场所----Hidden、ViewState、ControlState
1.使用隐藏域Session.Application和Cache都是保存在服务器内存中的.一般来说我们是无权访问客户端的机器,把数据直接保存在客户端的(Cookie是一个例外,不过Cookie只能保存 ...
- SpringMVC中利用@InitBinder来对页面数据进行解析绑定
同步发布:http://www.yuanrengu.com/index.php/springmvc-user-initbinder.html 在使用SpingMVC框架的项目中,经常会遇到页面某些数据 ...
- Android开发中Activity状态的保存与恢复
当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...
- VS Code 中的LaTeX自动保存问题
最近更新了VS Code,编辑LaTeX文档是出现了一个很恼人的问题:只要文档一改动,立马就Build,在更新之前是没有这个问题的. 解决方案如下:在设置里找到Auto Build: Run选项,将其 ...
- Android应用中使用AsyncHttpClient来异步网络数据(转载)
摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...
- Android应用中使用AsyncHttpClient来异步网络数据
首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...
随机推荐
- 【通过ssh oracle11g安装】centos6静默安装oracle11g
转载链接:https://blog.csdn.net/u011391839/article/details/76566316 根据实际情况略作调整~ 博主参考了以上链接成功进行安装,列一下自己遇到的坑 ...
- Codeforces 152C:Pocket Book(思维)
http://codeforces.com/problemset/problem/152/C 题意:给出n条长度为m的字符串,对于第一条字符串的每个位置利用第2~n条字符串的相应位置的字符去替换相应的 ...
- django ORM中的RelatedManager(关联管理器)
关联管理器应用在 一对多的表 或者 多对多的表 多对多表中的用法: 在多对多的表中 正向查询 #基于对象的查询 #正查 # author_obj = Author.objects.get(id=1) ...
- 01(b)无约束优化(准备知识)
1.解方程转化为优化问题 $n\left\{ \begin{aligned}& {{P}_{1}}(x)=0 \\ & {{P}_{2}}(x)=0 \\ & \text{ ...
- java 泛型?和T的区别
泛型三种: [1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型 [2]ArrayList& ...
- ZigBee按键中断
何为按键中断? 在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候: 突然有自身函数或外部的影响,而使程序执行到别的任务再回来. 举个栗子: 当你在做饭的时候,电 ...
- xfs 文件系统修复
pvcreate /dev/sdb1 pvcreate /dev/sdc1 pvcreate /dev/sdd1 vgcreate vg_bricks /dev/sdb1 vgcreate vg_br ...
- vue+element项目中使用el-dialog弹出Tree控件报错问题
1. 按正常的点击按钮,显示dialog弹出的Tree控件,然后把该条数据下的已经选中的checkbox , 用setCheckedNodes或者setCheckedKeys方法选择上 , 报下面这个 ...
- python安装及typora使用
第一章 环境搭建 1.1Python安装 1.1.1python官网www.python.org 1.1.2根据电脑系统选择下载 1.1.3确定电脑系统属性,此处我们以win10的64位操作系统为例 ...
- 软件测试必须掌握的linux命令大全
测试工程师的四大基础技能:数据库.linux.网络协议.测试工具,不管是刚入门还是已经工作多年,这几个方向都是要掌握的.今天我们再讲一下测试工程师必须要掌握的linux命令. 测试工程师需要掌握lin ...