Android橫豎屏切換及其對應布局載入問題,android布局載入
第一,橫豎屏切換連帶橫豎屏布局問題:
如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的布局。
可以通過以下兩種方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔案名稱不變,比如:layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式調用Activity的onCreate方法中的setOnContent(xxx),並自動載入相應的布局。
2)假如布局資源不按照如上設定,則可以通過java代碼來判斷當前是橫屏還是豎屏然後來載入相應的xml布局檔案。因為當螢幕變為橫屏的時候,系統會重新載入當前Activity的onCreate方法(也就是說:該Activity的生命週期要重頭開始),你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout 。
/** 1:豎屏 2:橫屏 判斷螢幕以旋轉的方向 */private int orientation;orientation=getResources().getConfiguration().orientation;
第二,強制設定螢幕的橫、豎屏方向:
Android橫豎屏切換在手機開發中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常要強制設定橫豎屏的方向,
通過在AndroidManifest.xml中設定activity中的android:screenOrientation屬性值來實現。
比如下列設定:
橫屏顯示設定:android:screenOrientation="lanscape"豎屏顯示設定:android:screenOrientation="portrait"
當然上述修改也可以在Java代碼中通過代碼來實現:(android螢幕的切換會重啟Activity,所以在Activity銷毀前儲存當前活動的狀態,並在Activity再次Create的時候載入配置)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
第三,攔截橫豎屏切換 需要的設定檔: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(Configurationnew Config) ,函數中擷取當前橫豎屏參數。至於其調用順序跟touch時間的行程順序相似,不過他沒有消費事件的概念,會順次調用到每一個onConfigurationChanged函數。
需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
需要注意的是,onConfigurationChanged函數中只能獲得橫豎屏切換後的參數,在該函數中擷取不到新的Layout和控制項的尺寸位置資訊,如果要處理尺寸和位置資訊,必須通過訊息非同步或者延時調用;
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land do nothing is ok } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port do nothing is ok } }
第四,自適應切換畫面:
如果想讓它啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然後手機切換橫豎屏就不能用了該怎麼解決呢?
首先:在Mainfest.xml中追加
android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"
然後:取得螢幕的長和寬,進行比較設定橫豎屏的變數。
Display display = getWindowManager().getDefaultDisplay();int width = display.getWidth();int height = display.getHeight();if (width > height) {orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; // 橫屏} else {orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // 豎屏}
然後:在onConfigurationChanged()函數中追加this.setRequestedOrientation(orientation)
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); this.setRequestedOrientation(orientation); }
但是這樣的話你切到別的畫面的時候再回到原畫面,它就仍然是橫的或者是縱的。怎麼讓它從別的螢幕回來後,又重新橫豎屏布局呢?
只要在OnResume()中在設定下就行了,但是這個僅僅只是支援橫豎屏只有一個layout的;
protected void onResume() {orientation = ActivityInfo.SCREEN_ORIENTATION_USER;this.setRequestedOrientation(orientation);Display display = getWindowManager().getDefaultDisplay();int width = display.getWidth();int height = display.getHeight();if (width > height) {orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;} else {orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;}super.onResume();}
有三點請注意:
1、不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
android 橫屏與豎屏布局不同時,需要onCreate()重新載入,怎不重新載入讓資料儲存,並切換不同的布局
資料都是在ondestory或者是在onsaveInstence中儲存,在oncreate中判斷當前是橫屏還是豎屏,在通過setContentView載入不同的布局檔案就行了,再把資料設定進去就行了
有時橫豎屏切換的時有沒自動載入layout布局檔案知道為何?
我大概知道原因,但還是不知道確切原因。在我的Mainfester.xml中的有些activity是android:configChanges="keyboardHidden|orientation"有些是android:configChanges="keyboardHidden|orientation|screenSize",後者會出現切換畫面不會重新載入對於的資源檔。說明沒有重新啟動activity,(據說從Android 3.2 (API level 13)開始,"screen size"也隨著裝置的橫豎屏切換而改變。因此,如果你在API level 13或更高(minSdkVersion和targetSdkVersion屬性聲明)進行開發時,要防止因方向改變而重新啟動,你必須為" orientation "添加"screen size"值。),如果這樣的話,那是不是我的每個activity中都要對我的onConfigurationChanged進行處理以保證螢幕載入正確和資料的完整?這樣感覺好麻煩,每個都要加正確的做法是不是這樣????