《Android编程权威指南》学习笔记——GeoQuiz

第一章到第三章的练习案例。包含多个地理问题,用户通过true和false按钮选择答案,应用通过Toast消息提示是否正确。点击next切换下一道题。

《Android编程权威指南》学习笔记——GeoQuiz_第1张图片
实现过程很简单,string.xml中定义字符串,即每到题目的内容。layout.xml中定义组件,按钮、菜单,或者笼统的说能够在屏幕上看到的都是组件。.java文件里继承相应的类重写相应的方法以实现行为。

主要的bug

无论用户在竖屏(portrait)状态下做了多少题,一旦旋转设备处于横屏(landmark)状态,会自动切回第一题。

原因

涉及到“设备配置 ”的概念。设备配置是一系列特征组合,用来描述当前的设备状态。比如:屏幕方向、屏幕像素密度、键盘类型以及语言等。通常为匹配不同的设备配置,应用会提供不同的备选资源。比如,这个项目里添加了多套箭头图标。
应用运行时,设备配置发生变化,可能会有更合适的资源来匹配变化后的设备配置。于是,Android销毁当前activity,为新配置匹配最佳资源,并创建新的activity使用这些资源。所以,竖屏状态下的Activity被销毁,横屏状态下创建了新的Activity,因此会切回第一题。

解决

新建备选资源,想办法保存设备旋转前的数据

新建布局文件layout-land.xml,做为旋转屏幕后的备选资源。其中-land称为配置修饰符,Android依靠配置修饰符定位最佳资源匹配当前设备配置。
《Android编程权威指南》学习笔记——GeoQuiz_第2张图片
保存activity销毁前的数据有多种方法,这里采用覆盖onSavedInstanceState(Bundle)bundle是一种存储键-值对的结构,键只能为字符串。将销毁前的数据保存到bundle对象中。

声明键值

private static final String KEY_INDEX = "index";

覆盖方法

protected void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Log.d(TAG,"savedInstanceState");
        savedInstanceState.putInt(KEY_INDEX,mCurrentIndex);
    }

在onCreate()方法中取出数据

 if(savedInstanceState != null){
            mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0);
        }

关于Activity的生命周期

onSavedInstanceState(Bundle)方法在onStop()方法调用之前由系统调用

《Android编程权威指南》学习笔记——GeoQuiz_第3张图片

进阶版本

包含了每章练习挑战内容的版本。第二章新建一个prev按钮照猫画虎很简单就能做出来。第三章的每答完一个题就禁止掉true和false按钮费了点脑细胞,后来参考着别的博客才做出来,学到一个新的方法组件.setEnabled()

参考链接:禁止一题多答

你可能感兴趣的:(学习笔记)