Android橫豎屏總結全

來源:互聯網
上載者:User

標籤:

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.
1 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
2 Log.i(“info”,”landscape”); // 橫屏
3 }
4 else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
5 Log.i(“info”,”portrait”); // 豎屏
6 }在onConfigurationChanged()方法中也可以檢測擁有硬鍵盤的鍵盤狀態
1 //檢測實體鍵盤的狀態:推出或者合上   
2 if (newConfig.hardKeyboardHidden ==Configuration.HARDKEYBOARDHIDDEN_NO){
3 //實體鍵盤處於推出狀態,在此處添加額外的處理代碼
4 }
5 else 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橫屏豎屏切換的問題
一、禁止橫豎屏轉換

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. public void onConfigurationChanged(Configuration newConfig) {

  2. super.onConfigurationChanged(newConfig);

  3. this.setRequestedOrientation(orientation);

  4. }

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

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

  1. protected void 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加入
@Override
public 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事件
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation)
{
//更改為LANDSCAPE
case (Configuration.ORIENTATION_LANDSCAPE):
//如果轉換為橫向屏時,有要做的事,請寫在這裡
break;
//更改為PORTRAIT
case (Configuration.ORIENTATION_PORTRAIT):
//如果轉換為豎向屏時,有要做的事,請寫在這裡
break;
}
}

八、備忘:

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

Android系統下橫屏豎屏切換功能的實現
一:不同的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代碼:

Android橫豎屏總結全

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.