最近开发应用的时候遇到一个需求,就是使用应用的时候需要强制横屏显示,本以为是一个非常简单的需求,可是真正在使用的时候却遇到了麻烦。我的应用是一个Activity+多个Fragment来实现的,遇到的问题是我的Fragment里面嵌套有视频播放,我是用的是饺子播放器(需求不高,只要能简单的播放一下视频就可以了,哪位伙伴有其他好用的视频播放器也可以留言推荐一下,谢谢),其他的时候设置了android:screenOrientation="landscape"
这句代码就没问题,可是点击播放视频就会变成竖屏,反正我是把我知道的方法都写在了里面,这里记录一下解决的办法:
首先我们来看一下 android:screenOrientation 的属性值:
android:screenOrientation=[“unspecified” | “user” | “behind” |“landscape” | “portrait” | “sensor” | “nonsensor”]
screenOrientation 用来指定Activity的在设备上显示的方向,每个值代表如下含义:
“unspecified” 默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape” 横屏显示(宽比高要长)
“portrait” 竖屏显示(高比宽要长)
“user” 用户当前首选的方向
“behind” 和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor” 有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor” 忽略物理感应器,这样就不会随着用户旋转设备而更改了 ( "unspecified"设置除外 )。
一般来说,我是在设置App的主题style时候设置的,如下所示:
<!-- Base application theme. -->
<style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name = "colorPrimary">@color/colorPrimary</item>
<item name = "colorPrimaryDark">@color/colorPrimaryDark</item>
<item name = "colorAccent">@color/colorAccent</item>
<!--全应用都只允许横屏-->
<item name="android:screenOrientation">landscape</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
但是设置了之后没有效果,网上说的是不能全局设置,只能每个Activity都去单独设置,如下所示:
<!-- tab主页面 -->
<activity android:name = ".MainActivity"
android:configChanges = "orientation|screenSize|keyboardHidden"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:screenOrientation="landscape"/>
这样设置了之后点击视频播放还是会变成竖屏,所以我就去把网上能找到的办法试了一下,有个读者说是可以在自定义的Application里面设置,如下所示:
//在自定义Application里边的onCreate()方法做个全局横屏
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//全局禁止竖屏
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
还有个是在Activity里面的onCreate方法里面代码设置,如下所示:
super.onCreate(savedInstanceState);
if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_main);
但是还是没有用,播放视频依然还是竖屏,于是我重写了onConfigurationChanged方法,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
AppLogMessageMgr.i(TAG,"LANDSCAPE = " + String.valueOf(Configuration.ORIENTATION_LANDSCAPE));
}else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
AppLogMessageMgr.i(TAG,"LANDSCAPE = " + String.valueOf(Configuration.ORIENTATION_PORTRAIT));
}
//保持横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onConfigurationChanged(newConfig);
}
这样手动来设置横屏就可以,但是 这样的话就会有一个问题,App会先横屏,然后再竖屏,最后是手动设置的横屏,会出现屏幕倒转的的一瞬间,哪位大佬看到了之后要是有好的方法,请您私信或者留言一下,谢谢。
转载自:https://blog.youkuaiyun.com/u014727709/article/details/105790192
欢迎start,欢迎评论,欢迎指正