Android橫屏豎屏切換的問題

以下是復制別人的文章過來的衅枫,目的是保留下這個方法靖避,便于今后查閱使用愉阎,該文章不會用于任何商業(yè)用途绷跑,該文章的出處:http://blog.sina.com.cn/s/blog_77c632410101790w.html
一、禁止橫豎屏轉(zhuǎn)換
Android橫豎屏切換在手機開發(fā)中比較常見氮发,很多軟件在開發(fā)過程中為了避免橫豎屏切換時引發(fā)不必要的麻煩渴肉,通常禁止掉橫豎屏的切換,
通過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現(xiàn)爽冕。
比如下列設置
android:screenOrientation="portrait"
則無論手機如何變動仇祭,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape"颈畸,為橫屏顯示乌奇。
上述修改也可以在Java代碼中通過類似如下代碼來設置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
另外,android中每次屏幕的切換動會重啟Activity眯娱,所以應該在Activity銷毀前保存當前活動的狀態(tài)华弓,在Activity再次Create的時候載入配置,那樣困乒,進行中的游戲就不會自動重啟了!

二贰谣、橫豎屏切換
如果要讓軟件在橫豎屏之間切換娜搂,由于橫豎屏的高寬會發(fā)生轉(zhuǎn)換,有可能會要求不同的布局吱抚“儆睿可以通過以下兩種方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件名不變,比如main.xml秘豹。layout-land是橫屏的layout,layout-port是豎屏的layout携御,其他的不用管,橫豎屏切換時程序為調(diào)用Activity的onCreate方法,從而加載相應的布局啄刹。
2)假如布局資源不按照如上設置涮坐,則可以通過java代碼來判斷當前是橫屏還是豎屏然后來加載相應的xml布局文件。因為當屏幕變?yōu)闄M屏的時候,系統(tǒng)會重新呼叫當前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每次橫豎屏切換都會重新調(diào)用onPause-> onStop-> onDestory-> onCreate->onStart->onResume昵时,為此涉及到內(nèi)容和數(shù)據(jù)的保存和讀取捷雕,否則轉(zhuǎn)屏之前的內(nèi)容就會消失了。很多時候這樣的結(jié)果讓程序繁瑣壹甥,為此Android提供了在manifest中設置android:configChanges屬性救巷,從而讓Activity不延續(xù)上述的重建流程。在Android工程的Mainfest.xml中配置Activity:android:configChanges="keyboardHidden|orientation"句柠,橫豎屏切換之后就不會去執(zhí)行OnCreat函數(shù)了浦译,而是會去調(diào)用onConfigurationChanged()這樣就能控制橫豎屏的切換了。用戶可以在Activity或View的onConfigurationChanged(Configuration newConfig)函數(shù)中獲取當前橫豎屏參數(shù)俄占。至于其調(diào)用順序跟touch時間的傳遞順序相似管怠,不過他沒有消費事件的概念,會順次調(diào)用到每一個onConfigurationChanged函數(shù)缸榄。
需要重寫Activity的onConfigurationChanged方法渤弛。實現(xiàn)方式如下,不需要做太多的內(nèi)容:
@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
}
}
需要注意的是甚带,onConfigurationChanged函數(shù)中只能獲得橫豎屏切換后的參數(shù)她肯,在該函數(shù)中獲取不到新的Layout和控件的尺寸位置信息,如果要處理尺寸和位置信息鹰贵,必須通過消息異步或者延時調(diào)用晴氨。
四、徹底禁止翻轉(zhuǎn)
當然如果要徹底禁止翻轉(zhuǎn)碉输,可以設置android:screenOrientation的屬性為nosensor籽前,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用敷钾,在真機上是正確的枝哄。
這里提一個小知識,Android模擬器中阻荒,快捷鍵"Ctrl+F11/F12"可以實現(xiàn)轉(zhuǎn)屏
五挠锥,自適應轉(zhuǎn)換
如果想讓它啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示侨赡,然后手機切換橫豎屏就不能用了該怎么解決呢蓖租?
首先:在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()函數(shù)中追加this.setRequestedOrientation(orientation)就行了
  9. public void onConfigurationChanged(Configuration newConfig) {
  10.  super.onConfigurationChanged(newConfig);  
    
  11.  this.setRequestedOrientation(orientation);  
    
  12. }
    但是這樣的話你切到別的畫面的時候再回到原畫面齐婴,它就仍然是橫的或者是縱的。怎么讓它從別的屏幕回來后球昨,又重新橫豎屏布局呢尔店?
    只要在OnResume()中在設定下就行了。但是這個只支持橫豎屏只有一個layout的主慰。橫豎屏分別對應layout的還不知道該怎么解決嚣州。
  13. protected void onResume() {
  14.  orientation = ActivityInfo.SCREEN_ORIENTATION_USER;  
    
  15.  this.setRequestedOrientation(orientation);  
    
  16.  Display display = getWindowManager().getDefaultDisplay();  
    
  17.  int width = display.getWidth();  
    
  18.  int height = display.getHeight();  
    
  19.  if (width > height) {  
    
  20.      orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  
    
  21.  } else {  
    
  22.     orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;  
    
  23. }  
    
  24. super.onResume();  
    
  25. }
    六、總結(jié)
    總之共螺,對于橫豎屏切換的問題该肴,統(tǒng)計了下,大家的解決辦法是:
    ①不理會藐不。匀哄。
    ②只豎屏顯示(android:screenOrientation="portrait")
    只橫屏顯示(android:screenOrientation="landscape")
    ③簡單的防止重載:
    在 AndroidManifest.xml中加入:android:configChanges="orientation|keyboardHidden"
    在activity中重載onConfigurationChanged事件
    @Override
    public void 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); //控件
}
}
七涎嚼、示例詳細步驟
//------ 第一步:獲得許可
需要在中添加相應許可
//------ 第二步:根據(jù)不同的目標,針對Activity進行設置
目標1:屏蔽橫豎屏的切換
步驟:為Activity設置一個默認的屏幕方向 方法如下:
在AndroidManifest.xml中找到該Activity 添加代碼:

android:name=".ActivityName"
android:screenOrientation="landscape"

設置Activity的默認方向為“橫向”
此處的screenOrientation有如下選項:
==================================================================
= unspecified 默認值挑秉,由系統(tǒng)判斷狀態(tài)自動切換
= 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 屏幕在縱向和橫向間旋轉(zhuǎn)
= keyboardHidden 鍵盤顯示或隱藏
= fontScale 用戶變更了首選的字體大小
= locale 用戶選擇了不同的語言設定
= keyboard 鍵盤類型變更法梯,例如手機從12鍵盤切換到全鍵盤
= touchscreen或navigation 鍵盤或?qū)Ш椒绞阶兓话悴粫l(fā)生這樣的事件
==================================================================
如果需要多個選項 用"|"隔開
此處注意:如果是在實體機上測試橫豎屏切換 需要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):
//如果轉(zhuǎn)換為橫向屏時犀概,有要做的事立哑,請寫在這里
break;
//更改為PORTRAIT
case (Configuration.ORIENTATION_PORTRAIT):
//如果轉(zhuǎn)換為豎向屏時,有要做的事姻灶,請寫在這里
break;
}
}
八铛绰、備注:
1、不設置Activity的android:configChanges時产喉,切屏會重新調(diào)用各個生命周期捂掰,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次
2曾沈、設置Activity的android:configChanges="orientation"時尘颓,切屏還是會重新調(diào)用各個生命周期,切橫晦譬、豎屏時只會執(zhí)行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時互广,切屏不會重新調(diào)用各個生命周期敛腌,只會執(zhí)行onConfigurationChanged方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卧土,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子像樊,更是在濱河造成了極大的恐慌尤莺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件生棍,死亡現(xiàn)場離奇詭異颤霎,居然都是意外死亡,警方通過查閱死者的電腦和手機涂滴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門友酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柔纵,你說我怎么就攤上這事缔杉。” “怎么了搁料?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵或详,是天一觀的道長。 經(jīng)常有香客問我郭计,道長霸琴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任昭伸,我火速辦了婚禮梧乘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勋乾。我一直安慰自己宋下,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布辑莫。 她就那樣靜靜地躺著学歧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪各吨。 梳的紋絲不亂的頭發(fā)上枝笨,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音揭蜒,去河邊找鬼横浑。 笑死,一個胖子當著我的面吹牛屉更,可吹牛的內(nèi)容都是我干的徙融。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼瑰谜,長吁一口氣:“原來是場噩夢啊……” “哼欺冀!你這毒婦竟也來了树绩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤隐轩,失蹤者是張志新(化名)和其女友劉穎饺饭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體职车,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘫俊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悴灵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扛芽。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖称勋,靈堂內(nèi)的尸體忽然破棺而出胸哥,到底是詐尸還是另有隱情,我是刑警寧澤赡鲜,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布空厌,位于F島的核電站,受9級特大地震影響银酬,放射性物質(zhì)發(fā)生泄漏嘲更。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一揩瞪、第九天 我趴在偏房一處隱蔽的房頂上張望赋朦。 院中可真熱鬧,春花似錦李破、人聲如沸宠哄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毛嫉。三九已至,卻和暖如春妇菱,著一層夾襖步出監(jiān)牢的瞬間承粤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工闯团, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辛臊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓房交,卻偏偏與公主長得像彻舰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子候味,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容