android 横竖屏的相关设置

转载 2014年10月23日 10:11:16

引言

1
2
3
4
    Activity在Configuration变化(比如设备横竖屏切换)时会重启Activity,即会执行onDestory()周期函数,然后onCreate(),重新创建Activity。这是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。
  (BTW,彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor)
  重启Activity可能导致布局长宽不合适,也可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。
  所以,Android横竖屏切换要解决的问题就两个:一、布局问题;二、重新载入问题。

一、布局问题

1.禁止切换横屏或竖屏

1
2
3
    可以在配置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.

1
2
3
4
5
6
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的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@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()之间。

使用方法如下:

1
2
3
4
5
@Override
public Object onRetainNonConfigurationInstance() {
    final MyDataObject data = collectMyLoadedData();
    return data;
}

在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@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://2711082222.blog.163.com/blog/static/106302249201221511171909/

但是在Android 4.0 横竖屏切换时要注意:

==Android 2.3以前的横竖屏切换==

在Android 2.3平台上,我们可以需要设置界面的横竖屏显示时,可以在AndroidManifest.xml中,对Activity的属性添加以下代码:

Android:configChanges="orientation"

同时在Activity中覆写onConfigurationChanged方法

1
2
3
4
5
6
7
8
9
@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

Log.i("TAG","I'm Android 2.3");

}

通过设置,当前Activity在横竖屏切换的时候,便不会重新走Activity的生命周期,而是直接执行onConfigurationChanged()方法里的内容。

==Android 4.0以后的横竖屏切换==

当我们在Android 4.0上像之前那样设置横竖屏时,会发现竟然没有效果,Activity依然走自己的生命周期,这是因为在API level 13以后Android做了修改了,SDK描述如下:

1
Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must decalare android:configChanges="orientation|screenSize". However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).

也就是说在Android 3.2(API level 13)以后,当设备横竖屏切换时屏幕尺寸也改变了。因此,如果你想在API Level 13或者更高的环境下,像以前那样阻止设备的横竖屏切换,你需要在orientation后加上screenSize。也就说你要像这样声明:android:configChanges="orientation|screenSize"。

也就是说我们现在要在AndroidManifest.xml中的Activity加入以下属性:

Android:configChanges="orientation|screenSize"

同时依然要在Activity中覆写onConfigurationChanged方法

1
2
3
4
5
6
7
8
9
@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

Log.i("TAG","I'm Android 4.0");

}

获取配置文件中设置的横竖屏状态

getRequestedOrientation()------该返回值是可以0或1



Android横竖屏设置

默认情况下,当用户手机的”屏幕旋转”选项打开后,旋转手机方向,手机屏幕也会跟随旋转的方向进行横竖屏切换. 设置屏幕旋转的方式有两种: 一.在AndroidManifest.xml设置 ...
  • qqwuy_muzi
  • qqwuy_muzi
  • 2017年04月01日 10:53
  • 750

android中如何让设配开启横竖屏

最近加入了新的需求,所以工作状态一直都是不停地改BUG改BUG改BUG,发现很多新的东西,可惜根本没有时间记录下来,现在正好闲下来了,刚好可以总结前段时间发现的一些有意思的东西。 我们都知道如何在清单...
  • Easyhood
  • Easyhood
  • 2017年06月13日 15:21
  • 396

Android屏幕横竖屏切换和生命周期管理的详细总结

Android屏幕横竖屏切换和生命周期管理的详细总结       一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。        今天想...
  • wenzhi20102321
  • wenzhi20102321
  • 2017年04月01日 09:46
  • 2989

Fragment 横竖屏切换问题

在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默...
  • xingfeng2010
  • xingfeng2010
  • 2014年01月27日 17:41
  • 6430

android: 横竖屏切换总结-布局改变和数据保存

目录: 引言 一、布局问题 二、重新载入问题 三、Q:横竖屏生命周期的切换有可能是什么样的? 引言         Activity在Configuration变化(比如设...
  • JugglerTao
  • JugglerTao
  • 2016年06月29日 14:18
  • 1779

Android横竖屏切换总结

Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简...
  • jiangxinyu
  • jiangxinyu
  • 2013年02月21日 21:43
  • 86377

Android关于处理运行时变化如横竖屏切换等问题

一些Android设备在运行时,它的configuration可能会变化(例如:横竖屏切换,键盘的显示或者隐藏,所用语言的变化),当这些类似的变化发生时,如果在不做任何代码处理的情况下,android...
  • ls4568206
  • ls4568206
  • 2016年06月23日 23:57
  • 820

Android APP 禁用横竖屏切换

默认情况下,Android APP的界面会随着手机方向的改变而改变,当手机处于竖屏状态,APP的界面也处于竖屏状态,而当手机处于横屏状态,APP也会自动切换到横屏状态。一般情况下APP的界面都是为竖屏...
  • sdjianfei
  • sdjianfei
  • 2016年06月03日 10:20
  • 1664

Android实战技巧之二十四:横竖屏切换

这几年一直在做手机上和电视盒的App,几乎没有考虑过横竖屏切换的问题。电视盒好说,横屏不变,你要是给它设计个竖屏人家也没机会使;而手机上的应用就不好说了,有些界面你设计了横竖屏兼容可能是为了表示你的功...
  • lincyang
  • lincyang
  • 2015年04月18日 22:42
  • 11903

【RecyclerView】Android 横竖屏切换 超便捷解决方案

相信Android 开发者大多数都遇到过横竖屏切换的需求,往往最后选择了锁定竖屏,或者锁定横屏的体验。或者每次切换屏幕就要切换显示数据的控件。谷歌官方推出的RecyclerView控件让你不再有这样的...
  • yaosongqwe
  • yaosongqwe
  • 2015年09月25日 10:28
  • 2153
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 横竖屏的相关设置
举报原因:
原因补充:

(最多只允许输入30个字)