1. 程式人生 > >Android橫豎屏切換總結

Android橫豎屏切換總結

               

Android橫豎屏要解決的問題應該就兩個:

一.佈局問題

二.重新載入問題

1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個引數:

"unspecified":預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向. "landscape":橫屏顯示(寬比高要長) "portrait":豎屏顯示(高比寬要長) "user":使用者當前首選的方向 "behind":和該Activity下面的那個Activity的方向一致(在Activity堆疊中的) "sensor":有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。 "nosensor":忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了("unspecified"設定除外)。

也可以在Java程式碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)來設定。

如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。可以通過以下方法來切換佈局:

1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔案不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。

2)通過 this.getResources().getConfiguration().orientation來判斷當前是橫屏還是豎屏然後來載入相應的 xml佈局檔案。因為當螢幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml.
1if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
2Log.i("info","landscape");// 橫屏
3}
4else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
5Log.i("info","portrait");// 豎屏
6}
在onConfigurationChanged()方法中也可以檢測擁有硬鍵盤的鍵盤狀態
1//檢測實體鍵盤的狀態:推出或者合上   
2if (newConfig.hardKeyboardHidden ==Configuration.HARDKEYBOARDHIDDEN_NO){
3//實體鍵盤處於推出狀態,在此處新增額外的處理程式碼
4}
5else if(newConfig.hardKeyboardHidden ==Configuration.HARDKEYBOARDHIDDEN_YES){
6//實體鍵盤處於合上狀態,在此處新增額外的處理程式碼
7}

2.重新載入問題。如果不需要從新載入,可以在AndroidManifest.xml中加入配置 android:configChanges="orientation|keyboardHidden",配置 android:configChanges的作用就是如文件所說的:Specify one or more configuration changesthat the activity will handle itself. If not specified, the activity will berestarted if any of these configuration changes happen in the system。這樣在程式中Activity就不會重複的呼叫onCreate()甚至不會呼叫onPause、onResume.只會呼叫一個 onConfigurationChanged(Configuration newConfig)。如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中儲存之前的操作內容或資料,則需要儲存之前的資料。然後在 activity的onCreate()中取出來。當然,如此就不能設定android:configChanges()了,否則就不會呼叫 onCreate()方法。

如果要徹底禁止翻轉,可以設定android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用,在真機上是正確的。android:screenOrientation="portrait"

則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。

android:screenOrientation="landscape",為橫屏顯示。

這裡提一個小知識,Android模擬器中,快捷鍵"Ctrl+F11/F12"可以實現轉屏

一、禁止橫豎屏轉換

Android橫豎屏切換在手機開發中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常禁止掉橫豎屏的切換,

通過在AndroidManifest.xml中設定activity中的android:screenOrientation屬性值來實現。

比如下列設定

android:screenOrientation="portrait"

則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。

android:screenOrientation="landscape",為橫屏顯示。

上述修改也可以在Java程式碼中通過類似如下程式碼來設定

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

另外,android中每次螢幕的切換動會重啟Activity,所以應該在Activity銷燬前儲存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!

二、橫豎屏切換

如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。可以通過以下兩種方法來切換佈局:

1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式為呼叫Activity的onCreate方法,從而載入相應的佈局。

2)假如佈局資源不按照如上設定,則可以通過java程式碼來判斷當前是橫屏還是豎屏然後來載入相應的xml佈局檔案。因為當螢幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。

if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE)

{  

    Log.i("info", "landscape"); // 橫屏 

}  elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)

 {  

   Log.i("info", "portrait"); // 豎屏 

 }

三、通過onConfigurationChanged攔截橫豎屏變換

按照二的操作,Activity每次橫豎屏切換都會重新呼叫onPause->onStop-> onDestory->onCreate->onStart->onResume,為此涉及到內容和資料的儲存和讀取,否則轉屏之前的內容就會消失了。很多時候這樣的結果讓程式繁瑣,為此Android提供了在manifest中設定android:configChanges屬性,從而讓Activity不延續上述的重建流程。Android工程的Mainfest.xml配置Activity:android:configChanges="keyboardHidden|orientation",橫豎屏切換之後就不會去執行OnCreat函數了,而是會去呼叫onConfigurationChanged()這樣就能控制橫豎屏的切換了。使用者可以在Activity或View的onConfigurationChanged(ConfigurationnewConfig)函式中獲取當前橫豎屏引數。至於其呼叫順序跟touch時間的傳遞順序相似,不過他沒有消費事件的概念,會順次呼叫到每一個onConfigurationChanged函式。

需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:@Override       public voidonConfigurationChanged(Configuration newConfig) {            super.onConfigurationChanged(newConfig);             if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_LANDSCAPE) {                  // land donothing is ok             } else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {                  // port donothing is ok             }       } 

需要注意的是,onConfigurationChanged函式中只能獲得橫豎屏切換後的引數,在該函式中獲取不到新的Layout和控制元件的尺寸位置資訊,如果要處理尺寸和位置資訊,必須通過訊息非同步或者延時呼叫。

四、徹底禁止翻轉

當然如果要徹底禁止翻轉,可以設定android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用,在真機上是正確的。

這裡提一個小知識,Android模擬器中,快捷鍵"Ctrl+F11/F12"可以實現轉屏

五,自適應轉換

如果想讓它啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然後手機切換橫豎屏就不能用了該怎麼解決呢?

首先:在Mainfest.xml中追加

android:screenOrientation="sensor"android:configChanges="orientation|keyboardHidden"

這兩個屬性。

第二步:取得螢幕的長和寬,進行比較設定橫豎屏的變數。

1. Display display = getWindowManager().getDefaultDisplay();  

2. int width = display.getWidth();  

3. int height = display.getHeight();  

4. if (width > height) {  

5.     orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  //橫屏

6. else {  

7.     orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;  //豎屏

8. }  

第三步:在onConfigurationChanged()函式中追加this.setRequestedOrientation(orientation)就行了

1. publicvoid onConfigurationChanged(Configuration newConfig) {  

2. super.onConfigurationChanged(newConfig);  

3. this.setRequestedOrientation(orientation);  

4. }  

但是這樣的話你切到別的畫面的時候再回到原畫面,它就仍然是橫的或者是縱的。怎麼讓它從別的螢幕回來後,又重新橫豎屏佈局呢?

只要在OnResume()中在設定下就行了。但是這個只支援橫豎屏只有一個layout的。橫豎屏分別對應layout的還不知道該怎麼解決。

1. protectedvoid onResume() {  

2.     orientation = ActivityInfo.SCREEN_ORIENTATION_USER;  

3. this.setRequestedOrientation(orientation);  

4.     Display display = getWindowManager().getDefaultDisplay();  

5. int width = display.getWidth();  

6. int height = display.getHeight();  

7. if (width > height) {  

8.         orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  

9.     } else {  

10.        orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;  

11.    }  

12.super.onResume();  

13.}  

六、總結

總之,對於橫豎屏切換的問題,統計了下,大家的解決辦法是: ①不理會。。②只豎屏顯示(android:screenOrientation="portrait") 只橫屏顯示(android:screenOrientation="landscape")③簡單的防止過載: 在 AndroidManifest.xml中加入:android:configChanges="orientation|keyboardHidden" 在activity中過載onConfigurationChanged事件 @Override  publicvoid onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); }④橫豎屏分別佈局 橫豎屏分別佈局的方法是:  在res下新建 layout-land 橫屏  layout-port 豎屏  然後把layout中的xml檔案分別考到以上目錄,修改佈局就可以了程式碼中不做任何更改。 在 AndroidManifest.xml檔案中的主Activity中加入 android:configChanges="orientation|keyboardHidden" 然後在主Activity中的onConfigurationChanged加入@Overridepublic void onConfigurationChanged(Configuration config) {super.onConfigurationChanged(config);if (config.orientation == Configuration.ORIENTATION_PORTRAIT){setContentView(R.layout.main); //佈局tv = (TextView) findViewById(R.id.EditText01);//控制元件}if (config.orientation == Configuration.ORIENTATION_LANDSCAPE){setContentView(R.layout.main); //佈局tv = (TextView) findViewById(R.id.EditText01);//控制元件}}

七、示例詳細步驟

//------ 第一步:獲得許可 需要在中新增相應許可

//------ 第二步:根據不同的目標,針對Activity進行設定

目標1遮蔽橫豎屏的切換

步驟:為Activity設定一個預設的螢幕方向方法如下: 在AndroidManifest.xml中找到該Activity 新增程式碼: android:name=".ActivityName"android:screenOrientation="landscape">設定Activity的預設方向為“橫向”此處的screenOrientation有如下選項:=================================================================== unspecified 預設值,由系統判斷狀態自動切換 = landscape 橫屏 = portrait 豎屏 =user 使用者當前設定的orientation值= behind 下一個要顯示的Activity的orientation值= sensor 使用感測器 感測器的方向 = nosensor 不使用感測器 基本等同於unspecified==================================================================目標2:防止Activity的銷燬

步驟:為Activity設定configChanges屬性在AndroidManifest.xml中找到該Activity 新增程式碼: android:name=".ActivityName"android:configChanges="orientation|keyboardHidden">此處的configChanges有如下選項:=================================================================== orientation 螢幕在縱向和橫向間旋轉= keyboardHidden 鍵盤顯示或隱藏 = fontScale 使用者變更了首選的字型大小 = locale 使用者選擇了不同的語言設定 = keyboard 鍵盤型別變更,例如手機從12鍵盤切換到全鍵盤= touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件 ==================================================================如果需要多個選項用"|"隔開此處注意:如果是在實體機上測試橫豎屏切換需要orientation選項【重點】如果要使得程式可以在Android模擬器上測試需要寫orientation|keyboardHidden如果缺少了keyboardHidden選項不能防止Activity的銷燬並且在之後提到的onConfigurationChanged事件中只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏

目標3:捕獲橫豎屏切換的事件步驟:在Activity中(ActivityName.java)重寫onConfigurationChanged事件@Overridepublic void onConfigurationChanged(Configuration newConfig) {// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);switch (newConfig.orientation){//更改為LANDSCAPEcase (Configuration.ORIENTATION_LANDSCAPE)://如果轉換為橫向屏時,有要做的事,請寫在這裡break;//更改為PORTRAITcase (Configuration.ORIENTATION_PORTRAIT)://如果轉換為豎向屏時,有要做的事,請寫在這裡break;}}

八、備註:

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

一:不同的layoutAndroid手機螢幕大小不一,有480x320, 640x360, 800x480.怎樣才能讓App自動適應不同的螢幕呢?其實很簡單,只需要在res目錄下建立不同的layout資料夾,比如layout-640x360,layout-800x480,所有的layout檔案在編譯之後都會寫入R.Java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。二:hdpi、mdpi、ldpi在之前的版本中,只有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是為了支援多解析度。drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:(1)drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)(2)drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480)(3)drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320)系統會根據機器的解析度來分別到這幾個資料夾裡面去找對應的圖片。三:橫屏豎屏在開發程式時為了相容不同平臺不同螢幕,建議各自資料夾根據需求均存放不同版本圖片。以下步驟是網上流傳的,不過我自己之前是通過圖形化介面實現這個配置,算是殊途同歸,有空我會把圖片貼上來。還要說明一點:每個activity都有這個屬性screenOrientation,每個activity都需要設定,可以設定為豎屏(portrait),也可以設定為無重力感應(nosensor)。要讓程式介面保持一個方向,不隨手機方向轉動而變化的處理辦法:在AndroidManifest.xml裡面配置一下就可以了。加入這一行
  • android:screenOrientation="landscape"
例如(landscape是橫向,portrait是縱向):Java程式碼:
  • <?xml version="1.0" encoding="utf-8"?>
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.ray.linkit"
  • android:versionCode="1"android:versionName="1.0">
  • <application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".Main"
  • android:label="@string/app_name"android:screenOrientation="portrait">
  • <intent-filter><action android:name="android.intent.action.MAIN" />
  • <category android:name="android.intent.category.LAUNCHER" /></intent-filter>
  • </activity><activity android:name=".GamePlay"
  • android:screenOrientation="portrait"></activity><activity android:name=".OptionView"
  • android:screenOrientation="portrait"></activity></application>
  • <uses-sdk android:minSdkVersion="3" />
  • </manifest>
另外,android中每次螢幕的切換動會重啟Activity,所以應該在Activity銷燬前儲存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!有的程式適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?可以在配置Activity的地方進行如下的配置android:screenOrientation="portrait"。這樣就可以保證是豎屏總是豎屏了,或者landscape橫向。而有的程式是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
  • @Override
  • public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);
  • if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {// land do nothing is ok
  • } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {// port do nothing is ok
  • }
  • }

1.

總體來說有兩種方案:

1.Android系統自動切換

  利用Android系統每次螢幕切換會重啟Activity的特性,在OnCreat處自動載入不同顯示狀態下的layout。

  例:main.xml是豎屏狀態下的layout,檔案保存於res/layout資料夾中。為實現橫屏切換,建立資料夾res/layout-land,在裡面建立新的介面檔案main.xml,與res/layout資料夾中檔案同名。則當裝置由豎屏切換到橫屏,或者反之時,在onCreate()函式中直接執行setContentView(R.layout.main)即可自動載入不同的介面檔案。

  另外,在res/layout-land中建立同名檔案是用系統自動判斷載入,也可以手動判斷載入。如在res/layout資料夾中有豎屏介面main-P.xml及橫屏介面main-L.xml,則可以在onCreate()函式中通過判斷橫豎屏狀態以顯式載入不同介面,程式碼:

int mCurrentOrientation =getResources().getConfiguration().orientation;

if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ){ 

   // If current screen isportrait

  setContentView(R.layout.main-P);

} else if ( mCurrentOrientation ==Configuration.ORIENTATION_LANDSCAPE ) {

   //If current screen islandscape

  setContentView(R.layout.main-L);

}

  由於android系統螢幕切換會重啟Activity,所以應該在Activity銷燬前儲存當前活動的狀態,在Activity再次Create的時候載入配置。

2.利用Activity的onConfigurationChanged()方法手動切換

  為避免Android系統自動重啟activity,需要在Androidmanifest.xml中相應Activity加上android:configChanges="keyboardHidden|orientation"屬性,使相應的Activity不重啟而是呼叫onConfigurationChanged(ConfigurationnewConfig)。

  例:res/layout下有豎屏介面main-P.xml及橫屏介面main-L.xml。onCreate()時同理判斷以顯示不同的介面:

   @Override

    protectedvoid onCreate(Bundle icicle) {

 super.onCreate(icicle);

 int mCurrentOrientation =getResources().getConfiguration().orientation;

 if ( mCurrentOrientation ==Configuration.ORIENTATION_PORTRAIT ) { 

     // Ifcurrent screen is portrait

    setContentView(R.layout.main-P);

 } else if ( mCurrentOrientation ==Configuration.ORIENTATION_LANDSCAPE ) {

     //Ifcurrent screen is landscape

    setContentView(R.layout.main-L);

 }

 init();//初始化,賦值等操作

 findViews();//獲得控制元件

 setListensers();//設定控制元件的各種監聽方法

    }

  過載onConfigurationChanged():

   @Override

    publicvoid onConfigurationChanged (Configuration newConfig){

super.onConfigurationChanged(newConfig);

int mCurrentOrientation =getResources().getConfiguration().orientation;

if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ){ 

   // If current screen isportrait

  setContentView(R.layout.main-P);

  //注意,這裡刪除了init(),否則又初始化了,狀態就丟失

   findViews();

   setListensers();

} else if ( mCurrentOrientation ==Configuration.ORIENTATION_LANDSCAPE ) {

   //If current screen islandscape

  setContentView(R.layout.main-L);

  //注意,這裡刪除了init(),否則又初始化了,狀態就丟失

   findViews();

   setListensers();

}

    }

  以上程式碼中需要注意init()函式,若需要儲存其它的狀態,如Button及各種View的顯示文字已經改變,在setListensers()務必進行恢復操作。

  同樣,也可以使用res/layout/main.xml和res/layout-land/main.xml方式,則不需判斷,直接使用setContentView(R.layout.main)即可。看程式碼:

   @Override

    protectedvoid onCreate(Bundle icicle) {

 super.onCreate(icicle);

 setContentView(R.layout.main);

 init();//初始化,賦值等操作

 findViews();//獲得控制元件

 setListensers();//設定控制元件的各種監聽方法

    }

  過載onConfigurationChanged():

   @Override

    publicvoid onConfigurationChanged (Configuration newConfig){

super.onConfigurationChanged(newConfig);

int mCurrentOrientation =getResources().getConfiguration().orientation;

if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ){ 

   // If current screen isportrait

  setContentView(R.layout.main);

  //注意,這裡刪除了init(),否則又初始化了,狀態就丟失

   findViews();

   setListensers();

} else if ( mCurrentOrientation ==Configuration.ORIENTATION_LANDSCAPE ) {

   //If current screen islandscape

  setContentView(R.layout.main);

  //注意,這裡刪除了init(),否則又初始化了,狀態就丟失

   findViews();

   setListensers();

}

    }

  其實在這種模式下,由於Android系統自動尋找不同介面檔案,而Androidmanifest.xml中已定義了android:configChanges="keyboardHidden|orientation"只監聽方向改變,因此onConfigurationChanged()方法還可以繼續精簡(除非在橫豎屏下狀態不同),直接設定介面、恢復狀態即可:

   @Override

    publicvoid onConfigurationChanged (Configuration newConfig){

super.onConfigurationChanged(newConfig);

setContentView(R.layout.main);

//注意,這裡刪除了init(),否則又初始化了,狀態就丟失

findViews();

setListensers();

    }

2.

橫豎屏切換的響應       如果沒有設定強制橫屏或者豎屏那麼每次橫豎屏切換的時候Activity都會被重新建立一次,這樣就會存在一個問題橫屏後會把圖片拉伸可能在豎屏時感覺很協調的介面切換到橫屏以後會被拉伸的很難看,比較好的解決辦法是為橫豎屏做兩套圖做兩個佈局檔案,這樣子程式中只需要監聽螢幕切換的結果設定不同的佈局 繪製不同的圖片即可。AndroidManifest.xml 中設定屬性禁止重新建立Activity,並且新增螢幕切換監聽。

  •             <activity android:name=".HandlerActivity"android:configChanges="orientation|keyboardHidden"/>

複製程式碼設定後螢幕切換後就不會再次呼叫OnCreate()方法重新建立這個Activity,切換螢幕之前程式中的一些資料或者內容就不會因為重新建立Activity導致重置清空。每當切換橫豎屏的時候系統會自己呼叫onConfigurationChanged()方法這樣子就可以拿到當前螢幕的橫豎屏狀態,根據狀態就可以做我們想做的事。

  • import android.app.Activity;
  • import android.content.res.Configuration;
  • import android.os.Bundle;
  • public class HandlerActivity extends Activity {
  •     @Override
  •     protected voidonCreate(Bundle savedInstanceState) {
  •        setContentView(R.layout.handler);
  •        super.onCreate(savedInstanceState);
  •     }
  •     @Override
  •     public voidonConfigurationChanged(Configuration newConfig) {
  •        int type =this.getResources().getConfiguration().orientation;
  •        if (type ==Configuration.ORIENTATION_LANDSCAPE) {
  •          //切換到了橫屏
  •        } else if(type == Configuration.ORIENTATION_PORTRAIT) {
  •          //切換到了豎屏
  •        }
  •        super.onConfigurationChanged(newConfig);
  •     }
  • }

 3.一:不同的layout

Android手機螢幕大小不一,有480x320,640x360, 800x480.怎樣才能讓App自動適應不同的螢幕呢?其實很簡單,只需要在res目錄下建立不同的layout資料夾,比如layout-640x360,layout-800x480,所有的layout檔案在編譯之後都會寫入R.Java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。二:hdpi、mdpi、ldpi在之前的版本中,只有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是為了支援多解析度。drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:(1)drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)(2)drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480)(3)drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320)系統會根據機器的解析度來分別到這幾個資料夾裡面去找對應的圖片。三:橫屏豎屏在開發程式時為了相容不同平臺不同螢幕,建議各自資料夾根據需求均存放不同版本圖片。以下步驟是網上流傳的,不過我自己之前是通過圖形化介面實現這個配置,算是殊途同歸,有空我會把圖片貼上來。還要說明一點:每個activity都有這個屬性screenOrientation,每個activity都需要設定,可以設定為豎屏(portrait),也可以設定為無重力感應(nosensor)。要讓程式介面保持一個方向,不隨手機方向轉動而變化的處理辦法:在AndroidManifest.xml裡面配置一下就可以了。加入這一行
  • android:screenOrientation="landscape"
例如(landscape是橫向,portrait是縱向):Java程式碼:
  • <?xml version="1.0"encoding="utf-8"?>
  • <manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.ray.linkit"
  • android:versionCode="1"android:versionName="1.0">
  • <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><activity android:name=".Main"
  • android:label="@string/app_name"android:screenOrientation="portrait">
  • <intent-filter><actionandroid:name="android.intent.action.MAIN"/>
  • <categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter>
  • </activity><activityandroid:name=".GamePlay"
  • android:screenOrientation="portrait"></activity><activityandroid:name=".OptionView"
  • android:screenOrientation="portrait"></activity></application>
  • <uses-sdkandroid:minSdkVersion="3" />
  • </manifest>
另外,android中每次螢幕的切換動會重啟Activity,所以應該在Activity銷燬前儲存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!有的程式適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?可以在配置Activity的地方進行如下的配置android:screenOrientation="portrait"。這樣就可以保證是豎屏總是豎屏了,或者landscape橫向。而有的程式是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
  • @Override
  • public void onConfigurationChanged(Configuration newConfig){super.onConfigurationChanged(newConfig);
  • if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_LANDSCAPE) {// land do nothing is ok
  • } else if (this.getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT) {// port do nothing is ok
  • }
  • }
  • http://www.3gtarena.com/danapeixunjishu/androidpeixun/471.html

Android橫豎屏切換相關總結

Android橫豎屏要解決的問題應該就兩個:一。佈局問題;二。重新載入問題。1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個引數:"unspecified"預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向."landscape"橫屏顯示(寬比高要長)"portrait"豎屏顯示(高比寬要長)"user"使用者當前首選的方向"behind"和該Activity下面的那個Activity的方向一致(在Activity堆疊中的)"sensor"有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。"nosensor"忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了 ( "unspecified"設定除外 )。也可以在Java程式碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);來設定。如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。可以通過以下方法來切換佈局:1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔案不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。2)通過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");}2.重新載入問題。如果不需要從新載入,可以在androidmanifest.xml中加入配置 android:configChanges="orientation",配置android:configChanges的作用就是如文件所說的:Specify one or more configuration changes that the activity will handle itself. If not specified, the activity will be restarted if any of these configuration changes happen in the system。這樣在程式中. Activity就不會重複的呼叫onCreate()甚至不會呼叫onPause.onResume.只會呼叫一個 onConfigurationChanged(Configuration newConfig)。–*************其實在這裡我遇到兩個奇怪的問題,那就是1.如果我在android:configChanges中只設置orientation,他依然會重新載入,只有設定了 orientation|keyboardHidden它才會只調用一個onConfigurationChanged(Configuration newConfig)2.當橫屏變豎屏的時候,他會呼叫兩次onConfigurationChanged,而豎屏轉橫屏時他只調用一次onConfigurationChanged,真是太奇怪了。如果你知道,歡迎留言共同探討*************–如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中儲存之前的操作內容或資料,則需要儲存之前的資料。然後在activity的 onCreate()中取出來。當然,如此就不能設定android:configChanges()了,否則就不會呼叫onCreate()方法。那麼資料可以儲存在哪呢?Android中四種儲存方法都可以,另外,還可以用Android為我們提供了 onRetainNonConfigurationInstance()方法來暫時儲存資料。下面為此舉個例子:儲存臨時圖片:1. @Override2. public Object onRetainNonConfigurationInstance() { 3. final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos]; 4.     keepPhotos(list); 5. return list; 6. } 之後便可以在activity的onCreate()函式中實現重新呼叫臨時檔案,在程式碼中需要判斷系統是否需要重新載入臨時檔案。以下是放在OnCreate()函式中載入臨時檔案的程式碼:1. private void loadPhotos() { 2. final Object data = getLastNonConfigurationInstance(); 3.  4. // The activity is starting for the first time, load the photos from Flickr5. if (data == null) { 6.         mTask = new GetPhotoListTask().execute(mCurrentPage); 7.     } else { 8. // The activity was destroyed/created automatically, populate the grid9. // of photos with the images loaded by the previous activity10. final LoadedPhoto[] photos = (LoadedPhoto[]) data; 11. for (LoadedPhoto photo : photos) { 12.             addPhoto(photo); 13.         } 14.     } 15. } 對於大多數的情況並不需要做如上的操作,所以需要謹慎使用這個行文,畢竟最好的行為也並不適用於所有情況,如果應用的不好反而會給程式帶來不必要的麻煩。如果要徹底禁止翻轉,可以設定android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過不知道為什麼,在模擬器上不管用,聽別人說在真機上是正確的,我沒有真機,等有了真機再試試看。

Android模擬器橫屏切換方法

如果android模擬器已經啟動後,可以使用快捷鍵F12或Ctrl+F11來切換。當然是用命令列僅僅啟動模擬器可以使用引數emulator.exe -skinHVGA-L 來啟動。

    需要注意的是,程式會過載onCreate,避免的方法可通過androidmanifest.xml檔案中重新定義方向,以及根據Activity的重寫onConfigurationChanged(Configuration newConfig)方法來控制。Activity 的 ConfigChanges 屬性官方解釋: 通過設定這個屬性可以使Activity捕捉裝置狀態變化,以下是可以被識別的內容:
CONFIG_FONT_SCALECONFIG_MCCCONFIG_MNCCONFIG_LOCALECONFIG_TOUCHSCREENCONFIG_KEYBOARDCONFIG_NAVIGATIONCONFIG_ORIENTATION
設定方法:將下列欄位用“|”符號分隔開,例如:“locale|navigation|orientation”ValueDescription“mcc“The IMSI mobile country code (MCC) has changed — that is, a SIM hasbeen detected and updated the MCC.移動國家號碼,由三位數字組成,每個國家都有自己獨立的MCC,可以識別手機使用者所屬國家。“mnc“The IMSI mobile network code (MNC) has changed — that is, a SIM hasbeen detected and updated the MNC.移動網號,在一個國家或者地區中,用於區分手機使用者的服務商。“locale“The locale has changed — for example, the user has selected a new language that text should be displayed in.使用者所在地區發生變化。“touchscreen“The touchscreen has changed. (This should never normally happen.)“keyboard“The keyboard type has changed — for example, the user has plugged in an external keyboard.鍵盤模式發生變化,例如:使用者接入外部鍵盤輸入。“keyboardHidden“The keyboard accessibility has changed — for example, the user has slid the keyboard out to expose it.使用者開啟手機硬體鍵盤“navigation“The navigation type has changed. (This should never normally happen.)“orientation“The screen orientation has changed — that is, the user has rotated the device.裝置旋轉,橫向顯示和豎向顯示模式切換。“fontScale“The font scaling factor has changed — that is, the user has selected a new global font size.全域性字型大小縮放發生改變1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行一次,網上有的說是,切豎屏會執行兩次,我在android2.3的模擬器和2.3手機上都試了,只有一次。但是在android2.2的模擬器上測試了,切豎屏的時候,會執行兩次宣告週期。2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次,而且,切豎屏的時候,最後還會呼叫onConfigurationChanged 。模擬器會按照以上說的執行,手機的話,不會執行宣告週期,只會執行 onConfigurationChanged3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

Android 禁止橫屏豎屏切換模式解析,android 橫屏佈局,android 橫屏切換,android 橫屏事件,android 禁止橫屏,對於可能需要禁止橫屏和豎屏模式之間的切換,我們可以在Android 佈局中加入相關語句,並間接鎖定 activity 不讓它重啟。

對於可能需要禁止橫屏和豎屏模式之間的切換,我們可以在 AndroidManifest.xml 裡面加入這一行

以下為引用內容: android :screenOrientation="landscape "  

其中 landscape 是橫向,portrait 是縱向,不過 android 中每次螢幕的切換動會重啟 Activity ,所以應該在 Activity 銷燬前儲存當前活動的狀態,在 Activity 再次 Create 的時候載入配置。在 activity 加下面的屬性,將不會重啟 activity :

以下為引用內容: android:configChanges="keyboardHidden|orientation".

而是去呼叫

以下為引用內容: onConfigurationChanged(Configuration newConfig). 

這樣就可以在這個方法裡調整顯示方式。

Java 檔案程式碼

以下為引用內容: @Override public void onConfigurationChanged(Configuration newConfig) { try { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port } } catch (Exception ex) { } }

http://www.desteps.com/application/mobile/0100216.html

Android 判斷橫屏還是豎屏,並且根據方向改變背景,android 橫屏佈局,android 判斷橫屏,android 判斷橫屏豎屏,android 切換背景,android 更換背景。

Android 判斷橫屏還是豎屏

android 判斷橫屏還是豎屏可以使用兩種方式:

1、getSystemService

以下為引用內容: /* First, get the Display from the WindowManager */Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();/* Now we can retrieve all display-related infos */int width = display.getWidth();int height = display.getHeight();int orientation = display.getOrientation();

2、getWindowManager

以下為引用內容: public int getScreenOrientation(){Display getOrient = getWindowManager().getDefaultDisplay();int orientation = getOrient.getOrientation();// Sometimes you may get undefined orientation Value is 0// simple logic solves the problem compare the screen// X,Y Co-ordinates and determine the Orientation in such casesif(orientation==Configuration.ORIENTATION_UNDEFINED){Configuration config = getResources().getConfiguration();orientation = config.orientation;if(orientation==Configuration.ORIENTATION_UNDEFINED){//if height and widht of screen are equal then// it is square orientationif(getOrient.getWidth()==getOrient.getHeight()){orientation = Configuration.ORIENTATION_SQUARE;}else{ //if widht is less than height than it is portraitif(getOrient.getWidth() < getOrient.getHeight()){orientation = Configuration.ORIENTATION_PORTRAIT;}else{ // if it is not any of the above it will defineitly be landscapeorientation = Configuration.ORIENTATION_LANDSCAPE;}}}}return orientation; // return value 1 is portrait and 2 is Landscape Mode}

android 判斷橫屏豎屏並切換背景

以下為引用內容: public static void AutoBackground(Activity activity,View view,int Background_v, int Background_h) { int orient=ScreenOrient(activity); if (orient == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {  view.setBackgroundResource(Background_v); // 縱向}else{view.setBackgroundResource(Background_h); // 橫向} } 

其中 Background_v 是縱向時的背景圖,Background_h 為橫向時的背景圖

然後在 activity 的 oncreate 方法中去呼叫

以下為引用內容: LinearLayout layout=(LinearLayout)findViewById(R.id.layout); androidUtil.AutoBackground(this, layout, R.drawable.bg_v, R.drawable.bg_h); // 背景自適應

一、禁止橫豎屏切換

Android橫豎屏切換在手機開發中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常禁止掉橫豎屏的切換,即通過在AndroidManifest.xml中設定activity中的android:screenOrientation屬性值來實現。

該android:screenOrientation屬性,他有以下幾個引數:

"unspecified":預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向.

"landscape":橫屏顯示(寬比高要長)

"portrait":豎屏顯示(高比寬要長)

"user":使用者當前首選的方向

"behind":和該Activity下面的那個Activity的方向一致(在Activity堆疊中的)

"sensor":有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。

"nosensor":忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了("unspecified"設定除外)。

比如下列設定

android:screenOrientation="portrait"

則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。

android:screenOrientation="landscape",為橫屏顯示。

上述修改也可以在Java程式碼中通過類似如下程式碼來設定

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

二、橫豎屏切換更改佈局

如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。可以通過以下兩種方法來切換佈局:

1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔名不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式為呼叫Activity的onCreate方法,從而載入響應的佈局。

2)假如佈局資源不按照如上設定,則可以通過java程式碼來判斷當前是橫屏還是豎屏然後來載入相應的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"); // 豎屏 

}

三、通過onConfigurationChanged攔截橫豎屏變換

按照二的操作,Activity每次橫豎屏切換都會重新呼叫onPause-> onStop-> onDestory-> onCreate->onStart->onResume,為此涉及到內容和資料的儲存和讀取,否則轉屏之前的內容就會消失了。很多時候這樣的結果讓程式繁瑣,為此Android提供了在manifest中設定android:configChanges屬性,從而讓Activity不延續上述的重建流程。假如使用者關心橫豎屏的切換,可以在Activity或View的onConfigurationChanged(Configuration newConfig)函式中獲取當前橫豎屏引數。至於其呼叫順序跟touch時間的

這裡寫圖片描述