一、 AndroidManifest.xml设置
如果只想设置屏幕横屏或者竖屏,只需要设置横竖屏:
<!--横屏-->
android:screenOrientation="landscape"
<!--竖屏-->
android:screenOrientation="portrait"
这样设置后即使屏幕旋转,Activity也不会出现销毁或方向旋转等反应,屏幕只有一个方向。
二、代码动态设置
需要动态改变横竖屏设置,只需要在代码中调用setRequestedOrientation()
函数,一般在Activity的onCreate
方法中设置:
//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//默认设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
这样做可以随意动态设置横竖屏的要求,但是当改变手机屏幕方向设置Activity
会被销毁,重新构建。
如果用户的手机没有开启方向锁定或者在AndroidManifest.xml
中设置了android:screenOrientation
,默认情况下,该Activity
不会响应屏幕旋转事件。在上述情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:
// onCreate 方法中
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
三、重写onConfigurationChanged
如果你不希望旋转屏幕的时候Activity
被不断的onCreate
(此情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:
首先,在AndroidMainfest.xml
中添加configChanges
:
<activity android:configChanges="orientation|keyboard">
</activity>
<activity/>
中的详细设置可参考官方文档。传送门
!注意,
keyboardHidden
表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize
,因为screenSize
会在屏幕旋转时改变;
android:configChanges="keyboardHidden|orientation|screenSize"
在Activity配置中添加上面代码切屏不会重新调用各个生命周期,只会执行onConfigurationChanged
方法。因此,在Activity
中重写onConfigurationChanged
方法,对屏幕方向变化进行监听处理:
/**
* Configuration newConfig
*/
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
setContentView(R.layout.portrait_layout);
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.landscape_layout);
}
}
优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged
函数不会被调用。
四、结合OrientationEventListener,自定义旋转监听设置
如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
private OrientationEventListener mOrientationListener;
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int rotation) {
if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation >= 135)&&(rotation <= 225))) {
//portrait
Log.d(TAG, "Screen orientation is Portrait!");
} else if (((rotation > 45) && (rotation < 135))||((rotation > 225) && (rotation < 315))) {
//landscape
Log.d(TAG, "Screen orientation is Landscape!");
}
}
};
mOrientationListener.enable();