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. 多线程与高并发(三)synchronized关键字

    上一篇中学习了线程安全相关的知识,知道了线程安全问题主要来自JMM的设计,集中在主内存和线程的工作内存而导致的内存可见性问题,及重排序导致的问题.上一篇也提到共享数据会出现可见性和竞争现象,如果多线程 ...

  2. mac下mysql的卸载和安装

    1. mysql的卸载 1 sudo rm /usr/local/mysql 2 sudo rm -rf /usr/local/mysql* 3 sudo rm -rf /Library/Startu ...

  3. C语言类型转换

    int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明. itoa():将整型值转 ...

  4. Visual Studio Code配置

    Visual Studio Code 从1.23.0开始VS Code就不再默认提供各语言版本, 而是改为使用插件的方式提供语言包. 在插件商店搜索Chinese (Simplified), 安装. ...

  5. 如何安装xenserver

    xenserver安装 选择键盘 是否同意协议 清理磁盘 选择本地磁盘安装 选择本地镜像文件 输入管理密码 配置IP地址 配置DNS服务器地址 选择地点 配置NTP服务器地址 开始安装 安装完成

  6. F#周报2019年第27期

    新闻 介绍Femto--使用Fable绑定的自动化npm包解决方案 Babel 7.5.0发布,包含动态导入与F#管道 iOS 13预览版发布 视频及幻灯片 Fabulous--F#用于跨平台移动应用 ...

  7. springboot集成mockito与powermock

      mockito大家都比较熟悉了,存在或者不存在,都不要紧,mockito让你有一种只要一出手,就知道有没有的感觉.但是它也不是万能的,比如静态方法.私有方法,它就无能为力了.这是为什么呢?当然不是 ...

  8. 基于SpringBoot从零构建博客网站 - 开发设置主页标识和修改个人信息功能

    由于守望博客系统中支持由用户自己设置个人主页的URL的后半段,所以必须要用户设置该标识的功能,而且是用户注册登录之后自动弹出的页面,如果用户没有设置该标识,其它的操作是不能够操作的,同时要求主页标识只 ...

  9. ORACLE常用函数的使用方法

    ORACLE常用函数的使用方法 1. 字符串函数 (1) length(); 获取字符长度SELECT LENGTH('中国') FROM PLATFORM_METAINFO_TABLES WHERE ...

  10. scrapy基础知识之 Scrapy 和 scrapy-redis的区别:

    Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础 ...