Android 台灣中文網

標題: 解決橫豎屏切換時重新載入的問題(onConfigurationChanged) [打印本頁]

作者: muska1116    時間: 2013-4-16 13:21
標題: 解決橫豎屏切換時重新載入的問題(onConfigurationChanged)
這是小弟之前做app時遇到的問題,以下是我後來找到可以解決的方法,跟大家分享:

在做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屬性值。

建議使用第一種方法。


作者: 子柚ppp    時間: 2013-8-23 13:42
蠻有用的 謝謝大大
作者: fsb6668    時間: 2013-8-24 14:19
感謝分享學習學習
作者: a5232352    時間: 2013-8-25 04:37
謝謝分享^^~~  研究看看~~~
作者: 一粒玉米    時間: 2013-10-7 00:44
不好意思 小弟對Android 還不是很熟
現在這個方法用在橫直轉換的時候已經可以 保存數據
想請問這個方法可不可以用在 BACK 的時候

在按下back的時候有一些按鈕數據
什麼的不想被清除的話
不知道要怎麼保留下來呢?
作者: kingyun1189    時間: 2013-10-7 12:55
一點一滴學習,日積月累成長,感謝分享。






歡迎光臨 Android 台灣中文網 (https://apk.tw/) Powered by Discuz! X3.1