ConfigurationTest以及横竖屏切换及2.3与4.0Configuration的区别

2.3下在手机旋转的时候会调用onConfigurationChanged,而4.0的手机不会。究其原因,感谢下面这位仁兄提供的资料。
http://blog.csdn.net/tangzhilu/article/details/7399988#

onConfigurationChanged  最近一直遇到一个很奇怪的问题。那就是我在AndroidManifest.xml的确设置了android:configChanges="orientation“,在我的Activity里也重写了onConfigurationChanged。但是同样的代码 在Android 4.0.3的手机里就不执行onConfigurationChanged。在Android 2.3里的手机执行一切正常。好几次去找原因,都因为自己不够耐心和仔细,而无功而退。直到今天决定慢悠悠地找,终于在这里找到了答案。

英文原文如下:

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).

(From http://developer.android.com/guide/topics/resources/runtime-changes.html)

TL;DR: add "|screenSize" to configChanges when targeting API level 13+

我的翻译:

自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation“,你还必须设置"ScreenSize",就像这样子,android:configChanges="orientation|screenSize"。但是呢,如果你的Target API 级别小于13,你的Activity自己会自动处理这种ScreenSize的变化。如果你的TargetSdkVersion小于13,即使你在Android 3.2或者更高级别的机器上运行程序,它还是会自己去处理ScreenSize的。

更多请参考 http://developer.android.com/guide/topics/resources/runtime-changes.html

我的备注:可能翻译的不好,反正意思就是,如果你的TargetSdk超过12,然后你想在安装了Android API level 超过12的设备上使用onConfigurationChanged,你就必须再对应的Activity里加上对应的screenSize。 一句话答案,把

android:configChanges="orientation" 改成android:configChanges="orientation|screenSize" 就OK了。

另外,StackOverFlow真是一个神奇的网站。

 
 
 
package hyz.com;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;

public class ConfigurationTestActivity extends Activity 
{
	private int count = 0;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        count = 1;
        Log.i("hyz", "onCreate"+count);        
    }
	@Override
	protected void onStart() 
	{
		super.onStart();
		count = 2;
		Log.i("hyz", "onStart"+count);
	}
	/* 在AndroidManifest.xml中添加android:configChanges="orientation|keyboard|keyboardHidden",
	 * 表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,将不再去执行onCreate()方法,而是直接执行onConfigurationChanged(), 
	 * 如此可以避免调用onCreate造成重复的初始化。
	 */
	@Override
	public void onConfigurationChanged(Configuration newConfig) 
	{
		super.onConfigurationChanged(newConfig);
		Log.i("hyz", "onConfigurationChanged"+count);
	}/*
  * 定义以下几种情况:
  * A:手机先竖放,再运行程序,调用layout-port里的布局,默认调用layout里的布局。
  * 并且,运行后无论手机横放还是竖放,布局依然是layout-port。但会转动方向。
  * B:手机先横放,再运行程序,调用layout-land里的布局,默认调用layout里的布局。
  * 并且,运行后无论手机横放还是竖放,布局依然是layout-land。但会转动方向。
  * C:无论手机先横放还是竖放,再运行程序时,都调用layout-port里的布局。
  * 并且,运行后无论手机横放还是竖放,布局依然是layout-port。不会转动方向,始终竖显。
  * D:无论手机先横放还是竖放,再运行程序时,都调用layout-land里的布局。
  * 并且,运行后无论手机横放还是竖放,布局依然是layout-land。不会转动方向,始终横显。
  * E:手机先横放,再运行程序,调用layout-land里的布局;运行后手机竖放,布局会重新加载,调用
  * layout-port。会转动方向,相反亦同理。
  * F:手机先横放,再运行程序,调用layout-land里的布局。运行后竖放,布局不变,不转动方向,始终横显;
  *   手机先竖放,再运行程序,调用layout-port里的布局。运行后横放,布局不变,不转动方向,始终横显(是横显)。
  * G:手机先横放,再运行程序,调用layout-land里的布局。运行后竖放,布局不变,不转动方向,始终竖显;
  *   手机先竖放,再运行程序,调用layout-port里的布局。运行后横放,布局不变,不转动方向,始终竖显(是竖显)。 
  * H:无论先横放还是竖放,调用layout-port里的布局 。运行后无认横竖放,布局不变,不转动方向,始终横显(是横显)。
  * 设置以下情况及对应调用布局情况(优先级升序):
  * 1、没有下面任一句话时-->E
  * 2、只添加android:configChanges="orientation"并在xxx.java中
  * 添加onConfigurationChanged()-->A|B
  * 3、只添加了android:screenOrientation="portrait"--->C
  * 4、只添加了android:screenOrientation="landscape"--->D
  * 5、只在xxx.java文件里加setRequestedOrientation(8)--->F
  * 6、只在xxx.java文件里加setRequestedOrientation(9)--->G
  * 7、3+5-->H   
  */
    
}


 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hyz.com"
    android:versionCode="1"
    android:versionName="1.0">
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".ConfigurationTestActivity" 
            android:configChanges="orientation|keyboard|keyboardHidden">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <!-- 这权限不加也能用 -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> 
        
</manifest>

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值