《Android编程权威指南》-读书笔记(七)
-处理旋转设备
旋转设备会改变设备配置(device configuration)。设备配置是用来描述设备当前状态的一系列特征。这些特征包括:屏幕的方向、屏幕的密度、屏幕的尺寸、键盘类型、底座模式以及语言,等等。
通常,为匹配不同的设备配置,应用会提供不同的备选资源。比如说不同的图标资源,全新的布局文件。
在运行时配置变更(runtime configuration change)发生时,很拗口,就是可以自动加载新的资源文件,新的布局文件的意思。
本章目标:
-
创建水平模式布局
-
设备旋转前保存数据
在上一章中http://www.cnblogs.com/canglin/p/4357585.html 我们使用Log分析了activity的生命周期,并且发现了旋转设备后,实际上是重新构造了一遍activity。在本章中,将会利用此特性在旋转后,选择新的图片资源以及布局结构。
创建水平模式布局
我们首先创建一个适合在旋转后显示的布局。
旋转后的layout文件在res/layout-land下,创建方法是右键layout->New->Layout resource file
文件名还是activity_quiz,目录名称改为layout-land。Root slement 我这里设置为了FrameLayout这里其实填写什么都没有关系,到了文件里面可以随时改,因为这个是旋转后的主要的控件变化不大,大可以从原来的文件中吧代码复制过来,然后在吧LinearLayout改成FrameLayout。点击确认后,文件显示为如下:
我是从Visual studio转过来的,这样的文件结构妥妥了看了半天才弄明白。
Layout-land是不会显示在文件结构里的。只是以文件activity_quiz(land)的形式显示了出来。这一点与Visual studio是有很大的不同的。
FrameLayout是一种最简单的ViewGroup组件,它不以特定方式安排其子视图的位置。FrameLayout子视图的位置排列都是由它们各自的android:layout_gravity属性决定的。
大概的样子如上图所示。App/src/mian/res/layout-land/activity_quiz.xml的代码如下:
http://git.oschina.net/canglin/GeoQuiz/commit/7df94925c856b155b9cddcaed5af097d7a605d55
设备旋转前保存数据
运行刚才的应用后,发现问题会回到初始状态。也就是没有保存程序的运行数据。现在把数据保存起来。
通过覆盖onSaveInstanceState()方法,将一些数据保存在Bundle中,然后在onCreate()方法中取回这些数据。在本例中通过重写onSaveInstanceState()方法将mCurrentIndex变量的值存到KEY_INDEX常量所定义的键值里。在onCreate(Bundle savedInstanceState)方法中,我们这样来获取mCurrentIndex的值
if(savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,mCurrentIndex);
}
通过重写onSaveInstanceState()来写入值
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG,"onSaveInstanceState");
savedInstanceState.putint(KEY_INDEX,mCurrentIndex);
}
代码如下:
http://git.oschina.net/canglin/GeoQuiz/commit/34b65ab4f15ac39611edc025030eeee4a362accb