Android编程权威指南(第四版)- 第 4 章 UI状态的保存与恢复

文章目录

  • 代码:
    • 依赖
    • MainActivity
    • QuizViewModel
    • Question
    • 知识点

代码:

大体是一样的,修改了一些

依赖

    implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")

MainActivity

package com.example.geoquizimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.ViewModelProviders
private const val KEY_INDEX = "index"
private const val KEY_SOCRE = "socre"
private const val KEY_BUTTONSTATUS="buttonStatus"
class MainActivity : AppCompatActivity() {private lateinit var questionText: TextViewprivate lateinit var ture_button: Buttonprivate lateinit var false_button: Buttonprivate lateinit var last_button: Buttonprivate lateinit var next_button: Buttonprivate lateinit var score_button: Buttonprivate val TAG="MainActivity"private val quizViewModel: QuizViewModel by lazy {ViewModelProviders.of(this)[QuizViewModel::class.java]}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val index= savedInstanceState?.getInt(KEY_INDEX,0)?:0quizViewModel.index=indexquestionText = findViewById(R.id.question)ture_button = findViewById(R.id.ture_button)false_button = findViewById(R.id.false_button)last_button = findViewById(R.id.last_button)next_button = findViewById(R.id.next_button)next_button = findViewById(R.id.next_button)score_button = findViewById(R.id.score_button)updateQuestion()//点击问题跳转下一题questionText.setOnClickListener(View.OnClickListener {quizViewModel.nextQuestion()updateQuestion()})ture_button.setOnClickListener(View.OnClickListener {quizViewModel.buttonStatus = falsecheckAnswer(true)closeButton()})false_button.setOnClickListener(View.OnClickListener {quizViewModel.buttonStatus = falsecheckAnswer(false)closeButton()})last_button.setOnClickListener(View.OnClickListener {openButton()quizViewModel.lastQuestion()updateQuestion()})next_button.setOnClickListener(View.OnClickListener {openButton()quizViewModel.nextQuestion()updateQuestion()})score_button.setOnClickListener(View.OnClickListener {settlementScore()})}override fun onStart() {super.onStart()Log.e(TAG, "onStart")}override fun onResume() {super.onResume()Log.e(TAG, "onResume")}override fun onPause() {super.onPause()Log.e(TAG, "onPause")}override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)Log.e(TAG,"onSaveInstanceState")//保存问题索引值outState.putInt(KEY_INDEX,quizViewModel.index)}override fun onStop() {super.onStop()Log.e(TAG, "onStop")}override fun onDestroy() {super.onDestroy()Log.e(TAG, "onDestroy")}private fun updateQuestion() {var textId = quizViewModel.questionIndexquestionText.setText(textId)}private fun checkAnswer(answer: Boolean) {var questionanswer = quizViewModel.questionAnswerif (answer == questionanswer) {quizViewModel.score += 20Toast.makeText(this, R.string.ture_toast, Toast.LENGTH_SHORT).show()} else {Toast.makeText(this, R.string.false_toast, Toast.LENGTH_SHORT).show()}}private fun closeButton() {if (!quizViewModel.buttonStatus) {ture_button.isEnabled = quizViewModel.buttonStatusfalse_button.isEnabled = quizViewModel.buttonStatus}}private fun openButton() {if (!quizViewModel.buttonStatus) {ture_button.isEnabled = truefalse_button.isEnabled = true}}private fun settlementScore() {//答完所有题结算成绩if (quizViewModel.index == quizViewModel.listSize - 1) {Toast.makeText(this, "得分为${quizViewModel.score}", Toast.LENGTH_SHORT).show()quizViewModel.score = 0} else {Toast.makeText(this, "题目没有答完哦", Toast.LENGTH_SHORT).show()}}
}

QuizViewModel

package com.example.geoquizimport androidx.lifecycle.ViewModelclass QuizViewModel : ViewModel() {var index = 0private var questionList = listOf(Question(R.string.question, true),Question(R.string.question1, true),Question(R.string.question2, true),Question(R.string.question3, false),Question(R.string.question4, false),Question(R.string.question5, false))var buttonStatus = true//按钮可以按var score = 0val listSize = questionList.sizeval questionIndex: Intget() = questionList[index].questionIDval questionAnswer: Booleanget() = questionList[index].answerfun nextQuestion() {index = (index + 1) % questionList.size}fun lastQuestion() {//       if (index == 0) {
//            index = questionList.size - 1
//        } else {
//            index -= 1
//        }index = if (index == 0) questionList.size - 1 else index - 1}}

Question

package com.example.geoquizimport androidx.annotation.StringResdata class Question(@StringRes val questionID: Int, val answer: Boolean) {
}

知识点

ViewModelProviders类提供了ViewModelProvider实例,调用ViewModelProviders.of(this)创建并返回一个关联了MainActivity的ViewModelProvider实例,ViewModelProvider会提供ViewModel实例给MainActivity

activity被销毁的两种情况:

  1. 用户结束使用activity
  2. 因设备配置发送改变时系统销毁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今年春节,德施曼成“春晚御用”智能锁,亮相总台春晚直播间

总台春晚,是每年春节期间的最大热点。 今年除夕夜,高端智能锁品牌德施曼,不仅成为“春晚御用”智能锁,还将旗下的哨兵猫眼智能锁,卖到了总台春晚的直播间里。龙年春节,德施曼智能锁携手小红书《大家的春晚》…

金融信贷风控评分卡模型

评分卡模型概念 评分模型是根据借款人的历史数据,选取不同维度的数据类型,通过计算而得出的对借款人信用情况打分的模型。不同等级的信用分数代表了借款人信用情况的好坏,以此来分析借款人按时还款的可能性。 评分卡模型分类 A卡&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月10日,星期六

每天一分钟,知晓天下事! 2024年2月10日 星期六 农历正月初一 春节 1、 国务院:到2025年,初步建成覆盖各领域、各环节的废弃物循环利用体系。 2、 国家移民管理局:部分国家人员可以用更多事由免签入境海南。 3、 市场…

华为配置无线监测环境与反制

华为配置无线环境检测与反制(WIDS/WIPS) 组网图形 图1 配置非法设备检测和反制示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业分支机构为了保证工作人员可以随时随地访问公司网络资源,部署WLAN基…

Spring 如何配置 bean (XML 方式)

请直接看原文:Spring 如何配置 bean (XML 方式)_spring 在哪配置bean 文件-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Java Bean 如何配置配置到 spring 容器中 基于 XM…

css的布局(BFC)

一、css中常规的定位方案 1、普通流 元素按照其在HTML中的先后位置自上而下布局。 行内元素水平排列,当行被占满后换行;块级元素则会被渲染为完整的一行。 所有元素默认都是普通流定位。 2、浮动 元素首先按照普通流的位置出现, 然后根据浮动…

【ETOJ P1046】斐波那契数列 题解(数学+动态规划)

题目描述 给定一个整数 T T T,表示样例数。 对于每个样例,给定一个整数 n n n,求斐波那契数列的第 n n n 项。 斐波那契数列定义为 f ( 1 ) f ( 2 ) 1 f(1) f(2) 1 f(1)f(2)1, f ( n ) f ( n − 1 ) f ( n − 2 ) f(…

跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备

项目维护: 修改文件结构: 头文件自己改改就好了 创建2DRendererLayer: Sandbox2D.h: #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void O…

图神经网络与图表示学习: 从基础概念到前沿技术

目录 前言1 图的形式化定义和类型1.1 图的形式化定义1.2 图的类型 2 图表示学习2.1 DeepWalk: 融合语义相似性与图结构2.2 Node2Vec: 灵活调整随机游走策略2.3 LINE: 一阶与二阶邻接建模2.4 NetMF: 矩阵分解的可扩展图表示学习2.5 Metapath2Vec: 异构图的全面捕捉 3 图神经网络…

mysql-面试题

一、SQL语句 1、SQL语句的分类 DQL:数据查询语言—selectDML:数据操作语言—insert/update/deleteDDL:数据定义语言—create/drop/alterDCL:数据控制语言—start transaction/commit/rollback2、Sql语句的执行顺序 SQL 语句的执行顺序与编写顺序并不相同FROM、ON、JOIN、W…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件(木马、病毒、恶意脚本、webshell等),并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方,由于程序对用户上传…

Ubuntu in VMware的问题

文章目录 安装单用户模式(安全模式)扩容硬盘复制粘贴必装共享文件夹在虚拟机中不显示猫孔堵塞需要通过VMware来实现重启效果后记 just 安装 下载iso文件后 安装向导中兼容性选14x 版本的VMware 后面不会出现vcpu问题 cpu 4x4 装完后启动会出现vcpu问题 重启虚拟机Ubuntu 此问题…

使用内联函数,降低函数调用开销,实现移动时绘制

easyx devc 开发。 AWSD移动&#xff0c;移动时可以左键绘制 左键绘制 左上角画笔颜色 右键拖拽 #include <graphics.h> // 使用关键字 inline 声明为内联函数&#xff0c;减少贴图函数频繁调用的开销导致的卡顿。 // 缓冲区纹理映射函数&#xff1a;bkmesh 映射目…

Python语言例题集(002)

#!/usr/bin/python3 #使用del语句删除元素 motorcycles[‘honda’,‘yamaha’,‘suzuki’] print(motorcycles) del motorcycles[0] print(motorcycles) motorcycles[‘honda’,‘yamaha’,‘suzuki’] print(motorcycles) del motorcycles[1] print(motorcycles) #使用方法po…

TOP100 二叉树(三)

11.114. 二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺…

PVST详解

PVST&#xff08;Per-VLAN Spanning Tree&#xff09;是Cisco公司的一种扩展的Spanning Tree协议&#xff0c;允许在每个VLAN中独立运行一个Spanning Tree实例&#xff0c;从而提高网络的可靠性和性能。 PVST协议在每个交换机中维护多个Spanning Tree实例&#xff0c;每个实例…

SegmentAnything官网demo使用vue+python实现

一、效果&准备工作 1.效果 没啥好说的&#xff0c;低质量复刻SAM官网 https://segment-anything.com/ 需要提一点&#xff1a;所有生成embedding和mask的操作都是python后端做的&#xff0c;计算mask不是onnxruntime-web实现的&#xff0c;前端只负责了把rle编码的mask解…

5G技术对物联网的影响

随着数字化转型的加速&#xff0c;5G技术作为通信领域的一次重大革新&#xff0c;正在对物联网&#xff08;IoT&#xff09;产生深远的影响。对于刚入行的朋友们来说&#xff0c;理解5G技术及其对物联网应用的意义&#xff0c;是把握行业发展趋势的关键。 让我们简单了解什么是…

AutoSAR(基础入门篇)7.2-AppL在Dev中的配置

目录 一、Application Component Types(SWC Type) 二、Service Component Types 三、Data Types 1、Application Data Types(ADT)

巧用liteflow,告别if else,SpringBoot整合liteflow

假设有一个三个原子业务&#xff0c;吃饭、喝水、刷牙。 现在有三个场景&#xff0c;分别是 场景A: 吃饭->刷牙->喝水 官网地址&#xff1a;https://liteflow.cc/ 1.添加依赖&#xff1a; <dependency><groupId>com.yomahub</groupId><artifactI…