如何强制App横屏或者竖屏显示应用

简介: 如何强制App横屏或者竖屏显示应用

最近开发应用的时候遇到一个需求,就是使用应用的时候需要强制横屏显示,本以为是一个非常简单的需求,可是真正在使用的时候却遇到了麻烦。我的应用是一个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会先横屏,然后再竖屏,最后是手动设置的横屏,会出现屏幕倒转的的一瞬间,哪位大佬看到了之后要是有好的方法,请您私信或者留言一下,谢谢。

相关文章
|
3月前
|
编译器 Linux PHP
【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
|
3月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
5天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
2月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
3月前
|
安全 JavaScript 应用服务中间件
【Azure Function App】如何修改Azure函数应用的默认页面呢?
【Azure Function App】如何修改Azure函数应用的默认页面呢?
|
3月前
【Azure Logic App】消费型逻辑应用在消费Service Bus时遇见消息并发速度慢,消息积压
【Azure Logic App】消费型逻辑应用在消费Service Bus时遇见消息并发速度慢,消息积压
|
3月前
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
|
3月前
|
存储 Linux 开发工具
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
|
3月前
|
域名解析 网络协议 网络安全
【App Service】遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的调试小工具
【App Service】遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的调试小工具
|
3月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误