参考
1.禁止APP内横竖屏切换
在 配 置 Activity 的 地 方 进 行 如 下 的 配 置
- android:screenOrientation="portrait"(landscape 是横向,portrait 是纵向)。这样就可以保证是竖屏总是竖屏
- android:screenOrientation="landscape"(landscape 是横向,portrait 是纵向)。这样就可以保证是横屏总是横屏
上述修改也可以在Java代码中通过类似如下代码来设置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
2.重启Activity的横竖屏切换的处理
缺省状态下,Activity每次横竖屏切换(包括用setRequestedOrientation调用)都会重新调用一轮onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,从而销毁原来的Activity对象,创建新的Activity对象,这是因为通常情况下软件在横竖屏之间切换,界面的高宽会发生转换,从而可能会要求不同的布局。
- 在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序自己会调用Activity的onCreate方法,从而根据当前横竖屏情况自动加载响应的布局。
- 假如布局资源是不一样又不按照如上设置,则需要通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件(比如mainP为竖屏mainL为横屏)。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。
上面这两种方式实现对于横竖屏的切换加载不同的布局文件,都会让activity重新加载一次,那么必然就会导致数据的丢失或者是数据的重新获取,造成了过多的额外的功耗,那么我们可以在翻转之前保存一下现在已经获取到的数据,那么在翻转之后就可以直接使用,而不需要重新获取或者重新加载,具体在下面看
- 重写Activity.onRetainNonConfigurationInstance(),用户横竖屏切换前保存数据
- 在onCreate()函数中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据
重写Activity.onRetainNonConfigurationInstance(),用户横竖屏切换前保存数据
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
在onCreate()函数中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
3.非重启Activity的横竖屏切换的处理
虽然重启Activity为我们提供了保存数据和读取数据的方式,但是如此一来程序会显得有些繁琐,所以有时候程序员往往就不想让Activity重启,Android也为我们提供了解决方案,就是通过onConfigurationChanged拦截横竖屏变换,从而进行必要的重新布局和切换操作。
操作步骤如下:
- 首先,manifest中为相应的Activity设置android:configChanges属性,从而让Activity不延续上述的重建流程
Andorid 3.2以前的SDK可以使用如下配置
android:configChanges="orientation|keyboardHidden"
而Adnroid 3.2以后的SDK必须添加一个screenSize属性,具体如下
android:configChanges="keyboardHidden|orientation|screenSize"
或者
android:configChanges="orientation|screenSize"
- 然后重写activity中onConfigurationChanged 方法
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
LANDSCAPE){
//TODO
}else
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
PORTRAIT){
//TODO
}
}