在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横屏一样的画面,这样会有2个问题,

  * 布局问题,在竖屏 显示的布局 到横屏中由于宽和高发生了变化所有多少都会影响到布局(除非你定制2套画面在然后加个判断在横屏时怎么显示,在竖屏时怎么显示),当然最简单的办法就是在 项目的 AndroidManifest.xml中找到你所指定的activity 中加上

  o 只竖屏显示的话(android:screenOrientation="portrait")

  o 只横屏显示的话(android:screenOrientation="landscape")

  * 画面重新载入问题:在默认情况下横竖 切换时会重新载入画面,导致一些不必要的资源浪费,更严重的是画面上保持的数据(特别是游戏方面)也都被重置了(当然你可以在重置前保存这些数据到数据库或者到文本文件中),要怎么避免在横竖 切换时重新载入画面,

  o 首先要在 AndroidManifest.xml中找到你所指定的activity 中加上android:configChanges="orientation|keyboardHidden"

  o 然后 在activity的逻辑处理中(代码部分)去重载onConfigurationChanged事件,具体代码参考一下:

  + @Override

  public void onConfigurationChanged(Configuration config) {

  super.onConfigurationChanged(config);

  }

在onConfigurationChanged中判断要显示的是横屏还是竖屏然后在setcontentview

还有种方法

在res文件夹下分别建立layout-port和layout-land,放竖屏和横屏的布局文件(同名的),会自动调用的。

以上就可以简单的控制你的app画面的显示方式并且在显示方式不变的情况下横竖 屏切换时不会重新加载画面,即优化的你的app同时用户体验也相应提高了。

(附注:以上摘自http://blog.csdn.net/muyu114/article/details/6334875

摘一: 
在开发游戏的时候,有些游戏是只能横屏玩的,所以手机竖立放置的时候,要保持游戏画面依然横屏。游戏开发之初最好就确定是用横屏还是竖屏,如果容忍转屏的话,不仅需要作两种界面布局,而且横竖屏切换很可能会内存溢出,导致程序崩溃。(文/jackliao) 

要做到这个要求其实很简单,在AndroidManifest.xml里面配置一下就可以了。加入这一行 
强制竖屏:

Java代码  
  1. android:screenOrientation="landscape"

或者在代码中: 

Java代码  
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

强制横屏: 

Java代码  
  1. android:screenOrientation="portrait"

或者在代码中: 

Java代码  
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

摘二: 
xml文件中设置: 

  要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。 

  代码: 

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏 

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏 

  ============延伸======== 

  屏幕会自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。同时,layout可能因为横屏带来不能合理适配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。这个属性可以理解为一个监听器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值为:keyboardHidden|orientation。 

摘三: 
Android 设置横屏模式显示,横屏模式大部分情况能弥补竖屏的不足——字体小、键盘小、画幅比例不合适,而且横屏模式下能提供更华丽、更流畅的感官体验,android 横屏,android landscape mode
,android 强制横屏,android 强制竖屏,android 横屏布局,android 设置全屏模式,android 横屏切换,android 设置横屏。 

有些游戏只能横屏,所以手机竖立放置的时候,要保持游戏画面依然横屏,对于屏幕界面布局,在游戏开发之初最好先确定是用横屏还是竖屏,如果容忍转屏的话,不仅需要作两种界面布局,而且横竖屏切换很可能会内存溢出,导致程序崩溃。 

Android 设置横屏布局 

1、AndroidManifest.xml 设置属性: 

Java代码  
  1. android:screenOrientation="landscape"
  2. android:configChanges="orientation|keyboardHidden"

代码中设置: 

Java代码  
  1. requestWindowFeature(Window.FEATURE_NO_TITLE);
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

2、设置为全屏模式: 

Java代码  
  1. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

3、强制为横屏: 

Java代码  
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

4、强制为竖屏 

Java代码  
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

(附注:以上摘自http://www.cnblogs.com/wanqieddy/archive/2012/03/01/2375124.html

目录:

引言

一、布局问题

二、重新载入问题

三、Q:横竖屏生命周期的切换有可能是什么样的?

引言

Activity在Configuration变化(比如设备横竖屏切换)时会重启Activity,即会执行onDestory()周期函数,然后onCreate(),重新创建Activity。这是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。

(BTW,彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor)

重启Activity可能导致布局长宽不合适,也可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。

所以,Android横竖屏切换要解决的问题就两个:一、布局问题;二、重新载入问题。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、布局问题

1.禁止切换横屏或竖屏

可以在配置Activity的地方进行如下的配置

android:screenOrientation="portrait"

android:screenOrientation="landscape"

或者 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.

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

Log.i("info", "landscape");

}

else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

Log.i("info", "portrait");

}

3)横竖屏切换用onConfigurationChanged

这种方法缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐.

首先要在配置Activity的时候进行如下的配置:

<activity android:name=".MyActivity"

android:configChanges="orientation|keyboardHidden"

android:label="@string/app_name">

另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

// Checks the orientation of the screen

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

....

} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();

.....

}

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、重新载入问题

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()之间。

使用方法如下:

@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();

}

...

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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://www.wumii.com/item/5dPI0esx

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

我的Android进阶之旅------>Android横竖屏切换总结的更多相关文章

  1. 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

    我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...

  2. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  3. 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  4. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  5. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  6. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  7. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  8. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...

  10. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)

    连连看的游戏界面十分简单,大致可以分为两个区域: 游戏主界面区 控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件, ...

随机推荐

  1. Cookie的增删改查

    增加: 第一种方法:Response.Cookies[“UserName”].Value=”张三” Response.Cookies[“UserName”].Expires=DateTime.Now. ...

  2. oracle 11g 中 (oracle 10g) crsctl 的 替换命令

     oracle 11g 中 (oracle 10g) crsctl 的 替换命令 Deprecated Command Replacement Commands crs_stat  ---集群状态 ...

  3. JaunsGraph数据模型

    JanusGraph采用邻接表(adjacency list)的方式存储图,也即图以顶点(vertex)和其邻接表组成.邻接表中保存某个顶点的所有入射边(incident edges). 通过将图采用 ...

  4. unity Changing Game View background color

    Change the background color in the camera 参考:http://forum.unity3d.com/threads/changing-game-view-bac ...

  5. 网页webbrowser

    http://www.codeproject.com/Articles/50544/Using-the-WebBrowser-Control-in-ASP-NET/

  6. onkeypress、onkeydown、onkeyup

    在使用JavaScript做WEB键盘事件侦听捕获时,主要采用onkeypress.onkeydown.onkeyup三个事件进行出来.该三个事件的执行顺序如下:onkeydown -> onk ...

  7. struts2的validate在使用过程中的一个问题

    在项目中有一个新增客户信息的的功能:  1.在进入加入页面:add.jsp页面之前,要调用一个add_init.do来获取省份信息列表以供在add.jsp进行选择. 2.add页面填写完毕以后.提交给 ...

  8. socket demo程序

    package cn.example.socket; import java.io.BufferedReader; import java.io.IOException; import java.io ...

  9. 虚拟化笔记05 OpenFiler configuration

    5.OpenFiler configuration 登录Openfiler 步骤1:安装 FireFox 步骤2:通过FireFox以HTTPS://server-ip:446 远程访问OpenFil ...

  10. 【Mac安装,ATX基于uiautomator2】之安装步骤

    Mac系统下安装uiaotumator2: 参考网址:<uiautomator2>以及参考github官方文档 注意:下面有坑,如果你没有下面的问题请直接跳转到 1.安装uiaotumat ...