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.
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橫豎總結

Android橫豎屏要解決的問題應該就兩個: 一.佈局問題 二.重新載入問題 1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activity中加上android:screenOr

Android橫豎切換總結

                Android橫豎屏要解決的問題應該就兩個:一.佈局問題二.重新載入問題1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有

Android橫豎切換總結(Android資料收藏)

Android橫豎屏切換總結(Android資料) Android橫豎屏要解決的問題應該就兩個: 一.佈局問題 二.重新載入問題 1.佈局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在專案的AndroidManifest.xml中找到你所指定的activi

android: 橫豎切換總結-佈局改變和資料儲存

目錄:引言一、佈局問題 二、重新載入問題 三、Q:橫豎屏生命週期的切換有可能是什麼樣的? 引言         Activity在Configuration變化(比如裝置橫豎屏切換)時會重啟Activity,即會執行onDestory()周期函式,然後onCreate(),重新建立Activity。這是因

Android實現橫豎的幾種方式

1.Android實現橫豎屏的方式: ① 在xml檔案裡面進行設定。一個是在activity的theme裡面進行設定<item name = "windowOrientation">橫屏、豎屏</item>   另一種:在清單檔案的activity節

一分鐘了解Android橫豎 mdpi hdpi xhdpi xxhdpi xxxhdpi

lin msu mage 豎屏 啟動 oar href super ide DPI:每英寸像素數 簡單的屏幕分辨率計算方法: DisplayMetrics metrics = this.getResources().getDisplayMetri

Android橫豎切換View設置不同尺寸或等比例縮放的XML解決方案

fill 文件結構 nts mas hang 同名 log lan spa 在一些應用中,涉及到橫豎屏切換,View要切換成不同大小比例尺寸。為解決這種開發場景,有多種解決方案,比如可以重寫View,實現橫豎切換在onMesure或者此類View的回調方法裏面重新測量重新繪

android 橫豎切換不重走生命周期

orien man ati nta 系統 生命周期 oar hang andro android在系統配置發生改變時,Activity會被重新創建,但是某些情況下我們希望系統配置改變時不會重新創建Activity,這個時候我們可以給Activity指定相對應的configC

【轉】Android橫豎重力自適應

ron ati lan target 設計 根據 use rpo 適應 通常我們的應用只會設計成橫屏或者豎屏,鎖定橫屏或豎屏的方法是在manifest.xml文件中設定屬性android:screenOrientation為"landscape"或"portrait":

(摘轉)Android橫豎切換小結

實際的專案從activity-a跳轉到B,在b的oncreate中設定        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);在b finish()之後回到act

android 橫豎切換的生命週期

如下設定,當橫豎屏切換時,activity的狀態是不會改變的 在manifest中設定該Activity的configChanges為android:configChanges="screenSize|keyboardHidden|orientation" 總結如下:

Android 橫豎切換載入不同的佈局

1.禁止APP內橫豎屏切換 在 配 置 Activity 的 地 方 進 行 如 下 的 配 置 android:screenOrientation="portrait"(landscape 是橫向,portrait 是縱向)。這樣就可以保證是豎屏總是豎屏 andr

Android橫豎切換你必須知道的事

       平常我們遇到的橫豎屏切換最大的問題就是,螢幕切換後,原來介面中的東西會被清空,也就是Activity被重新建立。那麼這時候就需要你做一些設定了,最簡單的就是在AndroidMainfest.xml中設定activity中的android:screenOrient

Android 橫豎+碎片的應用

最終效果展示: 專案介紹: 通過碎片的方式顯示標題列表和內容,其中也牽涉到橫豎屏的知識 專案程式碼下載:http://files.cnblogs.com/files/Laopengblog/%E7%A2%8E%E7%89%87and%E6%A8%AA%E7%AB%96%E5%B1%8F.rar 編寫

Android知識體系總結(方面覆蓋Android知識結構,面試&進階)

Android知識體系總結(全方面覆蓋Android知識結構,面試&進階 Version-1.0.1 時間:2018.09) 基本內容 : Android基礎知識:基本涵蓋Android所有知識體系,四大元件,Fragment,WebView,事件分

android橫豎切換,activity生命週期方法是否會回撥

預設情況下的一個應用,沒有在androidmainfest檔案進行任何設定一切都是預設的情況下,我們當改變了他的orientation時候是會銷燬當前activity,新建一個新的activity public void orien(View view)

Android 橫豎切換載入不同的佈局

橫屏豎屏在配置檔案中的設定,之前已經說過。那麼現在主要是說,切換之後由於螢幕寬高尺寸的改變,因此需要重新設定一個佈局檔案以適應現在的新的尺寸。 預設狀態下,Activity每次橫豎屏切換(包括用setRequestedOrientation呼叫)都會重新呼叫一輪onPaus

【RecyclerView】Android 橫豎切換 超便捷解決方案

相信Android 開發者大多數都遇到過橫豎屏切換的需求,往往最後選擇了鎖定豎屏,或者鎖定橫屏的體驗。或者每次切換螢幕就要切換顯示資料的控制元件。谷歌官方推出的RecyclerView控制元件讓你不再有這樣的煩惱。 最近這兩天又不是很忙了,閒下來看了些關於5.

Android橫豎設定

  如果activity預設是某種模式的,直接在AndroidManifest.xml中的對應activity項中,新增相應的程式碼即可實現   如:     android:screenOrientation="unspecified" 跟隨系統螢幕旋轉方向等(預設)     android:sc

Android 橫豎切換 導致崩潰

在不少應用中都會發生出現螢幕方向改變,但是在改變的時候又會發生什麼事情呢? 我們寫一個app測試一下 我們在mainActivity中寫了android生命週期中幾個重要的階段onCreate,onResume,onStart,onDestory,onS