如何强制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会先横屏,然后再竖屏,最后是手动设置的横屏,会出现屏幕倒转的的一瞬间,哪位大佬看到了之后要是有好的方法,请您私信或者留言一下,谢谢。
转载自:https://blog.youkuaiyun.com/u014727709/article/details/105790192
欢迎start,欢迎评论,欢迎指正

<think>好的,现在我要解决用户的问题:在平板上强制横屏显示应用,但应用显示的大小却是的。也就是说,虽然幕方向是的,但布局看起来像那样被压缩或拉伸了。我需要分析可能的原因和解决办法。 首先,用户已经在Manifest中设置了横屏,但布局显示不正确。这可能是因为布局文件没有适配横屏模式。安卓应用默认会根据幕方向加载不同的布局资源。例如,时使用layout-port目录下的布局,横屏时使用layout-land目录下的布局。如果用户没有为横屏创建专门的布局,系统可能直接使用的布局,导致显示问题。 接下来,我应该检查布局文件是否适配横屏。如果没有对应的横屏布局,应用会使用默认的布局,可能无法正确填充横屏的空间,导致元素拉伸或压缩。建议用户创建横屏专用的布局文件,放在res/layout-land目录中,调整控件的大小和位置以适应横屏的宽高比例。 另外,用户可能没有正确设置布局的约束或权重。在横屏模式下,宽度变大,高度变小,可能需要使用ConstraintLayout或者设置权重来让控件自适应。例如,使用LinearLayout的weight属性,或者ConstraintLayout的百分比约束,确保布局在不同方向下正确缩放。 还有可能是Activity的配置变化处理问题。如果用户在Manifest中设置了configChanges,但没有处理切换,系统可能不会重新加载布局,导致布局不更新。需要确认是否在Activity中正确处理了配置变化,或者是否应该让系统自动处理布局的重新加载。 此外,检查布局文件中是否有固定尺寸的设置,比如硬编码的dp值,这可能在横屏时导致布局错乱。应尽量使用match_parent、wrap_content或比例布局来适应不同方向。 最后,建议用户使用模拟器或真机测试横屏布局,查看实际效果,并使用Android Studio的布局检查工具来调试布局问题。可能需要调整横屏布局的XML文件,确保控件适应向的幕尺寸。</think>要让安卓应用在平板上强制横屏但保持布局的显示比例,需要同时控制幕方向和布局自适应。以下是具体解决方案: --- ### **问题原因** 当幕方向设为横屏(`landscape`)时,若未适配横屏布局,系统会直接拉伸布局,导致比例失调(如挤压、留黑边等)。 --- ### **解决方案** #### **1. 强制横屏 + 保持布局比例** 在 `AndroidManifest.xml` 中设置横屏方向,并通过布局约束保持比例: ```xml <activity android:name=".MainActivity" android:screenOrientation="landscape" <!-- 强制横屏 --> android:configChanges="orientation|screenSize"> <!-- 阻止Activity重建 --> </activity> ``` #### **2. 布局适配** 在 `res/layout/activity_main.xml` 中,**将根布局宽高设为比例**(如 9:16): ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center" <!-- 居中显示 --> android:layout_weight="1" android:weightSum="2"> <!-- 示例:固定比例区域(高度占幕的50%) --> <FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <!-- 内容 --> </FrameLayout> </LinearLayout> ``` --- ### **关键配置** | 方法 | 作用 | |---------------------|------------------------------------------------------------| | `android:screenOrientation="landscape"` | 强制横屏(传感器无关) | | `android:configChanges` | 阻止切换时Activity重建 | | 布局约束(weight/比例) | 强制内容按比例显示 | --- ### **效果说明** - **物理幕**:向铺满 - **内容区域**:居中显示,保持类似的 9:16 比例(两侧可能有黑边) - **交互逻辑**:仍按布局响应点击事件 --- ### **进阶适配(可选)** 若需完美适配横屏: 1. 创建横屏专属布局:在 `res/layout-land` 目录下新建同名XML文件 2. 动态调整代码逻辑:在 `onConfigurationChanged()` 中处理差异 --- ### **验证方法** 在平板上运行后,幕会**向固定**,但内容区域比例与一致(类似手机到平板横屏的效果)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想你依然心痛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值