安卓横竖屏大多数已经在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。