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. Java 添加、修改PPT幻灯片中的表格

    本文将介绍通过Java编程在PPT操作表格的方法.包括添加表格到PPT幻灯片,并设置表格样式.单元格对齐方式.单元格背景色.边框样式.字体.字号.合并单元格等:同时,通过加载已有表格的幻灯片也可以对表 ...

  2. 使用git提交时报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    Delta compression using up to 4 threads.Compressing objects: 100% (2364/2364), done.Writing objects: ...

  3. 最新ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)

      最近做了一个应用,需要用邮件发通知,但是免费的邮箱每天发信数量是有限制的,所以呢就想着搭建一个自己的邮件服务器,能够实现邮件的发送和接收即可,其中大概花了一个星期找资料,测试,终于成功了,写个教程 ...

  4. Linux不重启识别新添加的磁盘

    现网的一台EXSI 下的虚拟机一般在进行配置变更后都会通过重启来识别新增的配置,不过业务侧某台主机因为业务需要无法重启,想通过不重启直接识别护容上去的新磁盘.经测试,发现如下方可以解决. 1.通过ex ...

  5. Angular中input和output使用

    // 写法一: 1 @Components({ 2 ...., 3 inputs:['init'], 4 outputs:['finish'] 5 }) 6 export class xxx(){ 7 ...

  6. 真实项目中 ThreadLocal 的妙用

    一.什么是 ThreadLocal ThreadLocal 提供了线程的局部变量,每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作,但不会和其他线程的局部变量冲突,实现了线程间 ...

  7. 孰能巧用 Spring Cloud 服务注册中心Eureka

    Eureka介绍 在Spring Cloud Netflix 整合技术栈中,Eureka既可以作为服务注册中心也可以用于服务发现对整个微服务架构起着最核心的整合作用. Eureka是基于REST(Re ...

  8. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  9. secureCRT背景颜色

    secureCRT是我们常用的linux远程登录软件,某些情况下我们安装的secureCRT工具可能默认背景颜色为白色,使用时很容易造成眼睛的疲劳,网上有些教程也只是修改当前登录窗口背景颜色,新的连接 ...

  10. 和朱晔一起复习Java并发(二):队列

    和朱晔一起复习Java并发(二):队列 老样子,我们还是从一些例子开始慢慢熟悉各种并发队列.以看小说看故事的心态来学习不会显得那么枯燥而且更容易记忆深刻. 阻塞队列的等待? 阻塞队列最适合做的事情就是 ...