安卓横竖屏大多数已经在manifest文件中将activity使用android:screenOrientation="portrait"属性写死,如简单的界面切换可直接更改为"sensor"属性,但如复杂的界面需使用其他方法。
<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。