安卓橫豎屏大多數已經在manifest檔案中將activity使用android:screenOrientation="portrait"屬性寫死,如簡單的介面切換可直接更改為"sensor"屬性,但如複雜的介面需使用其他方法。
1監聽橫豎屏切換變化
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboard|layoutDirection|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
以下是manifest檔案中的配置,設定configchanges屬性是為了重寫設定切換監聽方法,設定為orientation或orientation|keyboardHidden或不設定時,生命週期均會執行一次,設定android:configChanges="orientation|keyboardHidden|screenSize"android:configChanges="orientation|keyboardHidden|screenSize" 不重新走生命週期方法僅執行onConfigurationChanged方法,注意這個改變實在api 13開始的。而之前版本已經很少使用,不再詳述。
程式碼中切換橫豎屏的方法為 Activity.this.setRequestedOrientation 在設定後還需要setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR)方法恢復,這是由於設定方法相當於manifest檔案設定,使用後就不會重力感應改變方向。如果不重走生命週期可以使用下方法
切換佈局。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
Toast.makeText(getApplicationContext(), "橫屏", Toast.LENGTH_SHORT).show();
//切換到橫屏
//修改佈局檔案
setContentView(R.layout.activity_main);
//findViewById ....
}else{
Toast.makeText(getApplicationContext(), "豎屏", Toast.LENGTH_SHORT).show();
}
}
如果使用重走生命週期,可能遇到儲存當前狀態的問題。重寫activity的onSaveInstanceState
方法儲存資料,資料以bundle形式儲存,先將資料儲存在方法形參中再執行super父方法。
儲存後使用onRestoreInstanceState
方法取出資料,在onCreate方法中可以取出儲存的資料。
如果在資原始檔夾多新增layout-land可以建立同名的佈局檔案,在橫豎屏切換的過程中自動顯示正確UI。