当前位置: 首页 > news >正文

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. 因设备配置发送改变时系统销毁

相关文章:

  • 记录学习--java abstract与interface使用区别
  • Vivado-IP核
  • vue3+vite+ts 配置commit强制码提交规范配置 commitlint
  • React+Antd+tree实现树多选功能(选中项受控+支持模糊检索)
  • c++之说_10|自定义类型 union 联合体
  • 霍金《时间简史》(A Brief History of Time)学习笔记(第四章)
  • FastAdmin
  • Gateway反向代理配置
  • 浅聊一下redis的雪崩,穿透和击穿
  • 练习题解(关于最小生成树)
  • ASP.NET Core 预防开放式重定向攻击
  • 网易和腾讯面试题精选---性能和优化面试问题
  • MySQL 表的增删查改(练习)
  • 百家cms代审
  • 用C语言实现单个网页图片爬虫
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CSS相对定位
  • express.js的介绍及使用
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript HTML DOM
  • JavaScript创建对象的四种方式
  • Java编程基础24——递归练习
  • Java到底能干嘛?
  • Java多态
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Object.assign方法不能实现深复制
  • python3 使用 asyncio 代替线程
  • Shadow DOM 内部构造及如何构建独立组件
  • text-decoration与color属性
  • Transformer-XL: Unleashing the Potential of Attention Models
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从零开始学习部署
  • 如何进阶一名有竞争力的程序员?
  • 如何胜任知名企业的商业数据分析师?
  • 我的zsh配置, 2019最新方案
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 因为阿里,他们成了“杭漂”
  • 在Mac OS X上安装 Ruby运行环境
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​你们这样子,耽误我的工作进度怎么办?
  • $.ajax中的eval及dataType
  • $.proxy和$.extend
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (Oracle)SQL优化技巧(一):分页查询
  • (python)数据结构---字典
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)springcloud实战之config配置中心
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • .NET : 在VS2008中计算代码度量值
  • .net mvc 获取url中controller和action
  • .NET6实现破解Modbus poll点表配置文件