You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oreo(8.1.0)竖屏方向配置异常问题咨询

解决应用启动时先横屏再切竖屏的问题

这个闪屏问题我之前也踩过坑!本质原因是系统启动Activity时,会先根据当前设备的物理方向初始化窗口,之后才会读取你在清单里的screenOrientation配置,或者执行Activity生命周期里的setRequestedOrientation代码,所以就会出现短暂的横屏再切回竖屏的尴尬。

下面给你两个亲测有效的解决方案:

方案一:用主题全局锁定竖屏(最简单省心)

直接在你的App主题里添加强制竖屏的属性,因为主题是应用启动时最早加载的配置之一,比Activity的清单配置生效更早,从根源上避免方向切换。

在res/values/styles.xml里修改你的主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- 保留你原有的主题属性 -->
    <item name="android:screenOrientation">portrait</item>
</style>

然后在清单文件里让整个应用或者目标Activity使用这个主题:

<application
    android:theme="@style/AppTheme"
    ...>
    <!-- 或者单独给某个Activity设置 -->
    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme"
        ...>
    </activity>
</application>

方案二:在Application初始化时提前锁定方向(更灵活)

如果你的需求更复杂(比如某些场景需要临时切换方向),可以在Application的onCreate方法里提前处理方向——因为Application的初始化比任何Activity都早,能在Activity启动前就把方向锁定。

创建自定义Application类:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        lockScreenToPortrait();
    }

    private void lockScreenToPortrait() {
        Resources resources = getResources();
        Configuration config = resources.getConfiguration();

        // 如果当前不是竖屏,强制切换
        if (config.orientation != Configuration.ORIENTATION_PORTRAIT) {
            config.orientation = Configuration.ORIENTATION_PORTRAIT;
            resources.updateConfiguration(config, resources.getDisplayMetrics());
        }

        // 监听配置变化,防止后续被系统偷偷切换
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            registerComponentCallbacks(new ComponentCallbacks2() {
                @Override
                public void onTrimMemory(int level) {}

                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig.orientation != Configuration.ORIENTATION_PORTRAIT) {
                        Resources res = getResources();
                        Configuration conf = res.getConfiguration();
                        conf.orientation = Configuration.ORIENTATION_PORTRAIT;
                        res.updateConfiguration(conf, res.getDisplayMetrics());
                    }
                }

                @Override
                public void onLowMemory() {}
            });
        }
    }
}

别忘了在清单里注册这个自定义Application:

<application
    android:name=".MyApplication"
    ...>
    ...
</application>

额外提醒:如果你的App有个别Activity需要横屏,只需要在对应的Activity清单里覆盖android:screenOrientation="landscape",或者在代码里动态设置即可,不会影响全局的竖屏配置。

内容的提问来源于stack exchange,提问作者Shoryuken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:19:18