android 解决横竖屏切换时重新载入的问题

在做android或者Ophone开发时,在默认情况下当萤幕从竖屏变到横屏时会触发 onConfigurationChanged事件。在默认情况下会重新载入画面并显示和横屏一样的画面,这样会有2个问题:

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

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

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

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

  1.首先要在 AndroidManifest.xml中找到你所指定的activity中加上

    android:configChanges="orientation|keyboardHidden"

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

                @Override                

      public void onConfigurationChanged(Configuration config)

      {

        super.onConfigurationChanged(config);                

      }

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

但是在自从android3.2以后,再这样设置的话,会发现转屏后仍然会调用OnCreate(),而不是onConfigurationChanged();跟踪framework层代码,就会发现问题所在,是由于google在android3.2中添加了screensize改变的通知,在转屏的时候,不仅是orientation发生了改变,screensize同样也发生了改变,而在判断是调用onConfigurationChanged还是OnCreate时,採用的是如下判断:

       
        int diff = activity.mCurrentConfig.diff(config);
        if (diff != 0) {
        // If this activity doesn't handle any of the config changes then don't bother calling onConfigurationChanged as we'regoing to destroy it.
                if ((~activity.mActivityInfo.getRealConfigChanged()& diff) == 0) {
                        shouldChangeConfig = true;
                }
        }
        public int getRealConfigChanged() {
                return applicationInfo.targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB_MR2 ? (configChanges | ActivityInfo.CONFIG_SCREEN_SIZE
| ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) : configChanges;
        }

通过上面的分析,可发现有两种方法解决该问题:(只需要修改AndroidManifest.xml) 1.指定android:configChanges="keyboardHidden|orientation|screenSize",其他的代码和以前的代码一样处理; 2.在AndroidManifest.xml中指定targetSdkVersion为3.2以前的版本(3.2的版本号为13),系统会自动加上screenSize属性值。

建议使用第一种方法。

原文地址:https://www.cnblogs.com/ericyuan/p/3552235.html