我的Android進階之旅------>Android橫豎屏切換總結

在默認情況下當屏幕從豎評變到橫屏時會觸發 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裏面配置一下就可以了。加入這一行 
強制豎屏: 

Java代碼  收藏代碼
  1. android:screenOrientation="landscape"  


或者在代碼中: 

Java代碼  收藏代碼
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  


強制橫屏: 
Java代碼  收藏代碼
  1. android:screenOrientation="portrait"  


或者在代碼中: 

Java代碼  收藏代碼
  1. 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 設置屬性: 
Java代碼  收藏代碼
  1. android:screenOrientation="landscape"  
  2. android:configChanges="orientation|keyboardHidden"  


代碼中設置: 
Java代碼  收藏代碼
  1. requestWindowFeature(Window.FEATURE_NO_TITLE);  
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);  


2、設置爲全屏模式: 
Java代碼  收藏代碼
  1. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  


3、強制爲橫屏: 
Java代碼  收藏代碼
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  


4、強制爲豎屏 
Java代碼  收藏代碼
  1. 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

==================================================================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章