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
相关产品推荐
相关产品推荐

