《Android编程权威指南》读书笔记(七) 处理旋转设备

《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

原文地址:https://www.cnblogs.com/canglin/p/4358067.html