在默認情況下當屏幕從豎評變到橫屏時會觸發 onConfigurationChanged 事件 在默認情況下會重新加載畫面並顯示和橫屏一樣的畫面,這樣會有2個問題,
* 佈局問題,在豎屏 顯示的佈局 到橫屏中由於寬和高發生了變化所有多少都會影響到佈局(除非你定製2套畫面在然後加個判斷在橫屏時怎麼顯示,在豎屏時怎麼顯示),當然最簡單的辦法就是在 項目的 AndroidManifest.xml中找到你所指定的activity 中加上
o 只豎屏顯示的話(android:screenOrientation="portrait")
o 只橫屏顯示的話(android:screenOrientation="landscape")
* 畫面重新載入問題:在默認情況下橫豎 切換時會重新載入畫面,導致一些不必要的資源浪費,更嚴重的是畫面上保持的數據(特別是遊戲方面)也都被重置了(當然你可以在重置前保存這些數據到數據庫或者到文本文件中),要怎麼避免在橫豎 切換時重新載入畫面,
o 首先要在 AndroidManifest.xml中找到你所指定的activity 中加上android:configChanges="orientation|keyboardHidden"
o 然後 在activity的邏輯處理中(代碼部分)去重載onConfigurationChanged事件,具體代碼參考一下:
+ @Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
}
在onConfigurationChanged中判斷要顯示的是橫屏還是豎屏然後在setcontentview
還有種方法
在res文件夾下分別建立layout-port和layout-land,放豎屏和橫屏的佈局文件(同名的),會自動調用的。
以上就可以簡單的控制你的app畫面的顯示方式並且在顯示方式不變的情況下橫豎 屏切換時不會重新加載畫面,即優化的你的app同時用戶體驗也相應提高了。
(附註:以上摘自http://blog.csdn.net/muyu114/article/details/6334875)
摘一:
在開發遊戲的時候,有些遊戲是隻能橫屏玩的,所以手機豎立放置的時候,要保持遊戲畫面依然橫屏。遊戲開發之初最好就確定是用橫屏還是豎屏,如果容忍轉屏的話,不僅需要作兩種界面佈局,而且橫豎屏切換很可能會內存溢出,導致程序崩潰。(文/jackliao)
要做到這個要求其實很簡單,在AndroidManifest.xml裏面配置一下就可以了。加入這一行
強制豎屏:
- android:screenOrientation="landscape"
或者在代碼中:
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
強制橫屏:
- android:screenOrientation="portrait"
或者在代碼中:
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
摘二:
xml文件中設置:
要實現這個目的,只需要在AndroidManifest.xml裏聲明Activity的時候加上一個屬性:android:screenOrientation,屬性取值landscape爲固定橫屏、portrait爲固定縱屏幕。
代碼:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//強制爲橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏
============延伸========
屏幕會自動切換時,默認狀態的應用程序,會重新調用onCreate,相當於重新啓動了一次應用程序。同時,layout可能因爲橫屏帶來不能合理適配的問題。爲了解決旋屏和鍵盤切換引起的程序重啓問題,還需要增加一個屬性:android:configChanges。這個屬性可以理解爲一個監聽器,它將攔截旋屏和鍵盤切換事件,阻止程序重啓而變爲回調onConfigurationChanged方法。這裏常用的屬性取值爲:keyboardHidden|orientation。
摘三:
Android 設置橫屏模式顯示,橫屏模式大部分情況能彌補豎屏的不足——字體小、鍵盤小、畫幅比例不合適,而且橫屏模式下能提供更華麗、更流暢的感官體驗,android 橫屏,android landscape mode ,android 強制橫屏,android 強制豎屏,android 橫屏佈局,android 設置全屏模式,android 橫屏切換,android 設置橫屏。
有些遊戲只能橫屏,所以手機豎立放置的時候,要保持遊戲畫面依然橫屏,對於屏幕界面佈局,在遊戲開發之初最好先確定是用橫屏還是豎屏,如果容忍轉屏的話,不僅需要作兩種界面佈局,而且橫豎屏切換很可能會內存溢出,導致程序崩潰。
Android 設置橫屏佈局
1、AndroidManifest.xml 設置屬性:
- android:screenOrientation="landscape"
- android:configChanges="orientation|keyboardHidden"
代碼中設置:
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
2、設置爲全屏模式:
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
3、強制爲橫屏:
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
4、強制爲豎屏
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
(附註:以上摘自http://www.cnblogs.com/wanqieddy/archive/2012/03/01/2375124.html)
目錄:
引言
一、佈局問題
二、重新載入問題
三、Q:橫豎屏生命週期的切換有可能是什麼樣的?
引言
Activity在Configuration變化(比如設備橫豎屏切換)時會重啓Activity,即會執行onDestory()週期函數,然後onCreate(),重新創建Activity。這是因爲這樣可以讓Activity動態適應Configuration,比如橫屏時使用橫屏的layout,drawable等resources,豎屏時使用豎屏的layout,drawable等resources。
(BTW,徹底禁止翻轉,可以設置android:screenOrientation的屬性爲nosensor)
重啓Activity可能導致佈局長寬不合適,也可能導致大量數據的重新獲取,網絡連接的重新建立等問題,用戶體驗非常差。所以應該在Activity銷燬前保存當前活動的狀態,在Activity再次Create的時候載入配置。
所以,Android橫豎屏切換要解決的問題就兩個:一、佈局問題;二、重新載入問題。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、佈局問題
1.禁止切換橫屏或豎屏
可以在配置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.
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 android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
另外需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
@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()之間。
使用方法如下:
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
在onCreate()中調用getLastNonConfigurationInstance(),獲取onRetainNonConfigurationInstance()保存的數據。
@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://www.wumii.com/item/5dPI0esx)
==================================================================================================
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:http://blog.csdn.net/ouyang_peng
==================================================================================================