第一。橫豎屏切換連帶載入多屏布局問題:
假設要讓軟件在橫豎屏之間切換。因為橫豎屏的高寬會發生轉換,有可能會要求不同的布局。
能夠通過下面兩種方法來切換布局:
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;
/**
假設使用該屏幕切換方式,則該Activity的生命周期在你切換屏幕的時刻會一直遵循:onPause()---->onStop--->onDestroy()---->onCreate()---->onStart()----->onResume(); 不會運行以下的方法:onConfigurationChanged(Configuration newConfig)
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
Toast.makeText(getApplicationContext(), "屏幕切換了", Toast.LENGTH_SHORT).show();
}
第二,強制設定屏幕的橫、豎屏方向:
Android橫豎屏切換在手機開發中比較常見,非常多軟件在開發過程中為了避免橫豎屏切換時引發不必要的麻煩。通常要強制設置橫豎屏的方向,
通過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現。
比方下列設置:
橫屏顯示設置:android:screenOrientation="lanscape" 豎屏顯示設置:android:screenOrientation="portrait"
當然上述改動也能夠在Java代碼中通過代碼來實現:(android屏幕的切換會重新啟動Activity,所以在Activity銷毀前保存當前活動的狀態,並在Activity再次Create的時候加載配置)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
第三,攔截橫豎屏切換 須要的配置文件:onConfigurationChanged
非常多時候這種結果讓程序繁瑣。為此Android提供了在manifest中設置android:configChanges屬性。從而讓Activity不延續上述的重建流程。
方式一)在Androidproject的Mainfest.xml中配置Activity:android:configChanges="keyboardHidden|orientation 。橫豎屏切換之后就不會去運行OnCreat函數了,而是會去調用onConfigurationChanged()這樣就能控制橫豎屏的切換了。
<Android橫豎屏切換不又一次調用onCreate()>可是,有一點請注意:Android2.3之前使用上面的android:configChanges="keyboardHidden|orientation就能行。可是,在4.0之后。
必須就要使用這個屬性android:configChanges="orientation|keyboardHidden|screenSize才干避免Activity又一次載入該類不延續上述的重建流程。
方式二)用戶能夠在Activity或View的:onConfigurationChanged(Configurationnew Config) ,函數中獲取當前橫豎屏參數。
至於其調用順序跟touch時間的傳遞順序相似,只是他沒有消費事件的概念。會順次調用到每個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 <群號:423923313>
