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横竖屏切换相关知识点

转载自:http://www.cnblogs.com/franksunny/p/3714442.html (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.c...

Android横竖屏相关

Android横竖屏要解决的问题应该就两个:一。布局问题;二。重新载入问题。 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所...

Android中横竖屏相关事宜

最近在做公司项目时,发现横竖屏切换和我原来的认知不太一样,原来我是知道同一个Activity横竖屏切换时,会导致生命周期重启。那么今天就趁此机会将android中横竖屏相关的知识总结一下。 首先,...

Android横竖屏切换相关总结

Android横竖屏要解决的问题应该就两个:一。布局问题;二。重新载入问题。1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定...

Android横竖屏切换相关

如何让Android横竖屏切换时不销毁当前activity 背景介绍: 在编写android小应用的时候,碰到了这样的一个问题:当推开手机的实体键盘时,屏幕由竖屏转换为横屏,此时应用程序的...

android 屏幕分辨率获取,等比缩放,屏幕横竖屏设置,屏幕截取

总结一下Android开发中适配性的问题,首先对于控件间距和大小最好使用屏幕密度dip去做,这样可以避免太大的差异 获取屏幕密度方法; DisplayMetrics dm = new Displa...
  • yudajun
  • yudajun
  • 2012年08月15日 17:59
  • 5550

android 动态设置横竖屏切换 控制dialog等布局文件加载的方法

android 中需要根据前一个activity的朝向去设置后面的一个activity,但是设置可能会在dialog时出现不能根据当前activity朝向来调用对应的资源文件。用这个方法你应该就能解决...
  • chniccs
  • chniccs
  • 2016年06月21日 23:34
  • 3529

android 横竖屏设置

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

android_判断横竖屏以及设置方式

判断横竖屏: 方式一: //调用getWidth()或getHeight()的方法已经过期了 //int width = getWindowManager().getDefaultDisplay(...
  • zrllz
  • zrllz
  • 2014年11月26日 00:28
  • 423

Android横竖屏切换View设置不同尺寸或等比例缩放的XML解决方案

Android横竖屏切换View设置不同尺寸或等比例缩放的XML解决方案在一些应用中,涉及到横竖屏切换,View要切换成不同大小比例尺寸。为解决这种开发场景,有多种解决方案,比如可以重写View,实现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 横竖屏的相关设置
举报原因:
原因补充:

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