ViewModel

简介

  ViewModel 允许数据在配置更改(如屏幕旋转)后仍然存在,使用 ViewModel 可以免去开发者花费大量时间精力处理Activity生命周期变化导致的数据刷新重建后的恢复问题。

  我们使用创建工程时,系统自动为我们添加的Text组件作为示范。

ViewModel的使用方法

Step 1:创建ViewModel类

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

  如图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190726142644852.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x330)

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。如图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190726144826336.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x180)

  设置完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非常便捷地恢复。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190726151019926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x)

【Android】Jetpack中的ViewModel:自动保存页面数据的更多相关文章

  1. Charles自动保存响应数据

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 操作环境 win10 nexus5x c ...

  2. 【React】377- 实现 React 中的状态自动保存

    点击上方"前端自习课"关注,学习起来~ 作者:陈俊宇 https://github.com/CJY0208 什么是状态保存? 假设有下述场景: 移动端中,用户访问了一个列表页,上拉 ...

  3. android项目中配置NDK自动编译生成so文件

    1 下载ndk开发包   2 在android 项目中配置编译器(以HelloJni项目为例)  2.1 创建builer  (a)Project->Properties->Builder ...

  4. 保存页面数据的场所----Hidden、ViewState、ControlState

    1.使用隐藏域Session.Application和Cache都是保存在服务器内存中的.一般来说我们是无权访问客户端的机器,把数据直接保存在客户端的(Cookie是一个例外,不过Cookie只能保存 ...

  5. SpringMVC中利用@InitBinder来对页面数据进行解析绑定

    同步发布:http://www.yuanrengu.com/index.php/springmvc-user-initbinder.html 在使用SpingMVC框架的项目中,经常会遇到页面某些数据 ...

  6. Android开发中Activity状态的保存与恢复

    当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...

  7. VS Code 中的LaTeX自动保存问题

    最近更新了VS Code,编辑LaTeX文档是出现了一个很恼人的问题:只要文档一改动,立马就Build,在更新之前是没有这个问题的. 解决方案如下:在设置里找到Auto Build: Run选项,将其 ...

  8. Android应用中使用AsyncHttpClient来异步网络数据(转载)

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  9. Android应用中使用AsyncHttpClient来异步网络数据

    首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...

随机推荐

  1. 【实战】SpringBoot + KafKa

    1.配置pom包 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId& ...

  2. C#常用设计模式--单例模式

    为什么要使用单例模式 在我们的整个游戏生命周期当中,有很多对象从始至终有且只有一个.这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁.  单例模式一般应用于管理器类,或者是一些需要持久化存在的 ...

  3. KVM web管理工具——WebVirtMgr

    系统环境: [root@kvm-admin ~]# cat /etc/redhat-release CentOS Linux release (Core) 关闭防火墙.selinux [root@kv ...

  4. 硬件笔记之Thinkpad T470P更换2K屏幕

    0x00 前言 手上的Thinkpad T470P屏幕是1920x1080的屏幕,色域范围NTSC 45%,作为一块办公用屏是正常配置,但是考虑到色彩显示和色域范围,计划升级到2K屏幕. 2k屏幕参数 ...

  5. 对于springboot的几种注入方法的个人看法

    最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时候懵逼了,由于我自己也是刚刚接触springboot不久,所以就 ...

  6. 【最小生成树之Kruskal算法】

    看完之后推荐再看一看[最小生成树之Prim算法]-C++ 定义:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以用kr ...

  7. 洛谷P2472 [SCOI2007]蜥蜴 题解

    题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...

  8. 洛谷 P1039 侦探推理

    题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...

  9. JS实现当前页弹出窗口,且页面变灰不可操作

    使用JS在当前页面在div中加载弹出窗口,并让当前页面变灰不可操作. 加载弹出窗口的div需将宽高设置成整个页面的大小,以覆盖当前页面的内容. opacity:0.6: 页面可见度设置为0.6(1为完 ...

  10. 个人永久性免费-Excel催化剂功能第98波-零代码零距离轻松接触并拥有金融大数据

    数据产生价值的一个最突出的领域-金融领域,股票.证券.上市公司财务报表等,多少人在其中发掘出宝贵的数据价值.今天Excel催化剂联合Tushare金融大数据平台,让这一切的数据都能成为你我普通人零代码 ...