綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[教程] 解決橫豎屏切換時重新載入的問題(onConfigurationChanged)

[複製連結] 查看: 2722|回覆: 5|好評: 1
跳轉到指定樓層
樓主
muska1116 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2013-4-16 13:21

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
這是小弟之前做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屬性值。

建議使用第一種方法。

「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 4碎鑽 +4 經驗 +1 幫助 +6 技術 +1 收起 理由
jack850628 + 1
xjxuvup + 1 + 1 非常讚
iamjason008 + 1
ploglin + 3 + 1 + 3 + 1 很給力!

查看全部評分

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
子柚ppp | 收聽TA | 只看該作者
發表於 2013-8-23 13:42
蠻有用的 謝謝大大
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
fsb6668 | 收聽TA | 只看該作者
發表於 2013-8-24 14:19
感謝分享學習學習
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
a5232352 | 收聽TA | 只看該作者
發表於 2013-8-25 04:37
謝謝分享^^~~  研究看看~~~
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
一粒玉米 | 收聽TA | 只看該作者
發表於 2013-10-7 00:44
不好意思 小弟對Android 還不是很熟
現在這個方法用在橫直轉換的時候已經可以 保存數據
想請問這個方法可不可以用在 BACK 的時候

在按下back的時候有一些按鈕數據
什麼的不想被清除的話
不知道要怎麼保留下來呢?
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

6
kingyun1189 | 收聽TA | 只看該作者
發表於 2013-10-7 12:55
由 手機網頁 發佈
一點一滴學習,日積月累成長,感謝分享。

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則