Android学习笔记(三七):再谈屏幕切换

切换需注意数据保存和恢复

  在Android学习笔记(三六):横屏竖屏的切换中,我们配置了两个layout,一个用户普通的portrait,一个用户landsapce方式。如果只有一个layout,我们沿用上一个例子,删除了在layout-land/中的xml文件,则在屏幕切换时,会按照原来的排版,适配新的屏幕。程序我进行了简化,每按一次pick,就加一,用此来跟踪是否需要进行数据保存和恢复,如下:

[java] view plaincopy

  1. public class Chapter19Test3 extends Activity{
  2. private Button pickButton = null;
  3. private int count = 0;
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setupViews();
  7. }
  8. private void setupViews(){
  9. setContentView(R.layout.chapter_19_test1);
  10. pickButton = (Button)findViewById(R.id.c19_pick);
  11. pickButton.setText("Pick " + count);
  12. pickButton.setOnClickListener(new View.OnClickListener() {
  13. public void onClick(View v) {
  14. count ++;
  15. pickButton.setText("Pick " + count);
  16. }
  17. });
  18. }
  19. }

  这是一个很简单的例子。我们发现在转屏的时候,是重新赋值。也就是也同样经过了destroy和create的阶段,同样需要进行保存和恢复。我们点击Pick按钮4次,通过模拟器Ctrl+F12进行切换,count重新归0。右边是另外两个例子,widget是一个输入框,我们可以看到如果我们修改了输入况中的值,旋转之后是不改变的,因为widget的内容,系统会帮我们处理,而widget外的我们需要处理。如果我们在例子中跟踪onCreate和onDestroy会发现,每次转动屏幕的时候,都会调用destroy,然后create。而且每次切换,destroy-create-destroy-create,但是我不确定是否只是模拟器,在实际target设备上是否也如此,可以看到切换后有一个明显UI的变更,可以解释为什么重新create两次。

  关于如何数据保存和恢复,见Android学习笔记(三六):横屏竖屏的切换 。

不进行屏幕切换

  由于某些原因,例如游戏,在切换屏幕的过程中,由于动作慢导致游戏失败,我们希望不触发屏幕切换。我们在AndroidManifest.xml中在activity进行设置:

<activity android:name=".xxxxx" ...... android:screenOrientation="portrait" />

  即使我们在layout-land/补充了相关的layout的xml,也不会触发横屏和竖屏的布局的转换。

  需要注意的是,我们跟踪发现,切换也同样会导致destroy->re-create,也就是需要进行数据的保存和恢复。由于Android的硬件设备类型很多,有些是通过smartkey,有些是通过物理键盘的打开,而在模拟器中就是“CTRL+F12”来强制进行屏幕切换。如果我们需要和iPhone那样有定位陀螺仪来触发屏幕的切换,我们只需在AndroidManifest.xml中<activity android:name=".xxxxx"  ......   android:screenOrientation="sensor" />即可。

自己控制旋转

我们如果希望自己控制屏幕选择,在收到相关的屏幕旋转的事件后,由程序自行控制处理,而不是系统自动处理。可以通过以下步骤:

一、在AndroidManifest.xml中的activity,增加android:configChanges属性,表示我们需要自行控制这些处理

[html] view plaincopy

  1. <activity android:name=".xxx" ... android:configChanges="keyboardHidden|orientation"  />

  有一点比较奇特的就是,如果我们只设置orientation或者keyboardHidden,会有一些奇怪的现象,可能只出现在模拟器,因为CTRL+F12是模拟器的键盘操作。不确定实际设备会否如此。模拟器切换触发了key和orientation两个事件,我们现默认这种情况。

二、在程序中通过onConfigurationChanged()获得相关的事件并进行处理。

  在切换的时候,系统,通过onConfigurationChanged()包括事件,系统将不会自行去处理界面,也就是不会因为重新描绘画面而对activity进行destroy和re-create,也就是最重要的,不会导致数据的重初始化而导致需对数据进行保存和恢复,仅此也是一种比较便捷的处理方式。

[java] view plaincopy

  1. public void onConfigurationChanged(Configuration newConfig) {
  2. super.onConfigurationChanged(newConfig);
  3. setupViews();
  4. }

  一般而且,我们可以通过newConfig来排断但前的状态,例如用switch(newConfig.orientation)来判断当前方向,而判断如何处理,在这个例子中,简单地重绘UI就可以了。

相关链接: 我的Android开发相关文章

时间: 2024-12-22 01:17:39

Android学习笔记(三七):再谈屏幕切换的相关文章

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

Python学习笔记(六)再谈Python模块

Python程序包含多个模块文件,一个主体.顶层文件实现主要控制流程.调用组件和工具,其他模块文件则提供组件和工具,python自带了许多实用的模块称为标准链接库.模块是python中最高级别的程序组织单元,将代码和数据封装起来以便重用.每一个文件都是一个模块,并且可以通过"导入"来使用其他模块的变量(顶层定义的所有变量).模块被导入时就生成了一个模块对象.从抽象的角度看,模块的作用有: 1)代码重用-模块文件的代码可以永久保存,可以被多个客户端使用.任意的重新运行和重载 2)划分系统

Android学习笔记(三四):再谈Intent(上)-一些知识

在Android学习笔记(七):多个Activity和Intent中,我们先在学会了如何使用intent在代码中唤起activity.此处作深一步地学习. 什么是Intent intent是对一个操作处理的抽象描述.context可以在使用startActivity(intent)来launch一个actvivity,就如我们在学习笔记(七)中的处理,也是最常用的方式,将activity在我们的应用中整合:可以在通过sentBroast(intent)来广播给任何有兴趣的BroadcastRec

Android学习笔记(三五):再谈Intent(下)-一些实践

Android的UI框架要求用户将他们的app分为activity,通过itent来进行调度,其中有一个main activity由Android的launcher在桌面中调用.例如一个日历的应用,需要查看日历的activity,查看单个事件的activity,编辑事件的activity等等.在查看日历的activity中,如果用户选择的某个事件,需要通过查看事件的activity来处理.这就是最近本的app UI框架,本次,我们将学习如何通过intent来完成. Activity之间的关系 某

【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transaction进行切换,很方便提供切换的效果. 利用setTransition() 在Pro Android学习笔记(三九):Fragment(4):基础小例子-续的“Step 4:实现showDetail(int index),如何管理fragment”中,介绍了如何在容器FrameLayout中通过frag

【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖排时,如下图显示: 屏幕上只显示一个fragment,点击列表上的数目,进入到简介的activity.下面介绍实现的方式. 设置横排和竖排的不同排版风格 在 Pro Android学习笔记(四):了解Android资源(下)的“资源和配置的变更”中,我们介绍了如何同资源文件夹名设置不同资源.缺省的l

转 Android开发学习笔记:浅谈WebView

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法: 第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity

文章转载仅仅能用于非商业性质,且不能带有虚拟货币.积分.注冊等附加条件.转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei. 通过widget定义.我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时.假设在appwidet-provider中定义了android:configure的java类,在widget实例创建后会立即唤起配置activity.这个activity主要完毕两个任务:1.配置初始化数据