引言
一、布局问题
1.禁止切换横屏或竖屏
或者 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
这样就可以保证是竖屏总是竖屏了,或者横屏总是横屏。
2.可以切换横屏或竖屏
若要软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:
1)layout-land和layout-port 在res目录下建立layout-land(横屏的layout)和layout-port(竖屏的layout)目录,相应的layout文件不变,比如main.xml。其他的不用管,模拟器会自动寻找。
2)onCreate()中判断横竖屏 通过this.getResources().getConfiguration().orientation判断当前是横屏还是竖屏,然后加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.
3)横竖屏切换用onConfigurationChanged
这种方法缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐.
首先要在配置Activity的时候进行如下的配置:
另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:
二、重新载入问题
1.不需要重新载入在androidmanifest.xml中加入配置 android:configChanges="orientation|keyboardHidden"
横竖屏切换时调用onConfigurationChanged(Configuration newConfig)注意:当横屏变竖屏的时候,他会调用两次onConfigurationChanged,而竖屏转横屏时他只调用一次。
2.重新载入,保存之前数据不变onSaveInstanceState()和onRestoreInstanceState()
Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState。
注意 :
*我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。
3.重新载入,保存之前数据不变onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()
需要在重新载入过程中保存之前的操作内容或数据,则需要保存之前的数据。然后在activity的 onCreate()中取出来。当然,如此就不能设置android:configChanges()了,否则就不会调用onCreate()方法。那么 数据可以保存在哪呢?Android中四种存储方法都可以。
还可以用Android为我们提供了onRetainNonConfigurationInstance()方法来暂时保存数据。
当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。
onRetainNonConfigurationInstance这个方法最大的好处是:
* 当Activity曾经通过某个资源得到一些图片或者信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。
* 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。
* 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。
注意:
* 我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。
* onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。
* 调用顺序同样介于onStop() 和 onDestroy()之间。
使用方法如下:
在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据。
Q:横竖屏生命周期的切换有可能是什么样的?
a、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
如下:启动一个Activity,
onCreate()
onStart()
onResume()
竖屏切换到横屏:(调用一次生命周期)
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
横屏切换到竖屏:(调用两次生命周期)
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
b、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
c、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
转自:http://2711082222.blog.163.com/blog/static/106302249201221511171909/
但是在Android 4.0 横竖屏切换时要注意:
==Android 2.3以前的横竖屏切换==
在Android 2.3平台上,我们可以需要设置界面的横竖屏显示时,可以在AndroidManifest.xml中,对Activity的属性添加以下代码:
Android:configChanges="orientation"
同时在Activity中覆写onConfigurationChanged方法
通过设置,当前Activity在横竖屏切换的时候,便不会重新走Activity的生命周期,而是直接执行onConfigurationChanged()方法里的内容。
==Android 4.0以后的横竖屏切换==
当我们在Android 4.0上像之前那样设置横竖屏时,会发现竟然没有效果,Activity依然走自己的生命周期,这是因为在API level 13以后Android做了修改了,SDK描述如下:
也就是说在Android 3.2(API level 13)以后,当设备横竖屏切换时屏幕尺寸也改变了。因此,如果你想在API Level 13或者更高的环境下,像以前那样阻止设备的横竖屏切换,你需要在orientation后加上screenSize。也就说你要像这样声明:android:configChanges="orientation|screenSize"。
也就是说我们现在要在AndroidManifest.xml中的Activity加入以下属性:
Android:configChanges="orientation|screenSize"
同时依然要在Activity中覆写onConfigurationChanged方法
获取配置文件中设置的横竖屏状态
getRequestedOrientation()------该返回值是可以0或1