无法强制Activity仅横屏显示(Manifest已正确配置)
嘿,我之前也踩过一模一样的坑!既然你已经试过在AndroidManifest.xml里配置android:screenOrientation="landscape",也在onCreate()里调用了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)都没效果,那问题大概率出在你用的自定义主题上——这类整合来的主题经常会暗藏一些影响屏幕方向的配置,下面给你几个排查方向:
检查主题中的
android:configChanges配置
有些自定义主题会添加orientation|screenSize这类属性值,这相当于告诉系统「我自己处理配置变化」,会直接导致你的横屏设置被忽略。你可以打开主题的xml文件,搜索这个属性:- 如果发现类似
<item name="android:configChanges">orientation|screenSize|keyboardHidden</item>的配置,先移除orientation|screenSize这两个值,或者直接删掉整个configChanges项,再测试横屏是否生效。
- 如果发现类似
检查主题是否强制竖屏
部分自定义主题会偷偷设置android:screenOrientation="portrait",它的优先级比你在单个Activity里的配置更高。解决方法有两个:- 直接在主题xml里删掉这个属性;
- 在Activity的Manifest配置中添加
tools:override="true"来覆盖主题的设置,示例代码:
注意要在Manifest的根节点先声明<activity android:name=".YourTargetActivity" android:screenOrientation="landscape" tools:override="true" />tools命名空间:xmlns:tools="http://schemas.android.com/tools"
排查第三方库/全局代码的干扰
如果你有全局的BaseActivity,或者使用了某些路由、全屏类的第三方库,它们可能会在后台修改屏幕方向。可以先临时把这个Activity的父类改成默认的AppCompatActivity,移除所有第三方库的初始化代码,测试横屏是否正常,逐步定位干扰源。用默认主题验证问题
把这个Activity的主题暂时换成系统默认主题,比如Theme.MaterialComponents.DayNight.NoActionBar或者Theme.AppCompat.Light.NoActionBar,如果横屏能正常生效,那就能确定是自定义主题的问题,再回头仔细排查主题里的每一项配置。
要是还是解决不了,可以把你的自定义主题代码贴出来,我帮你再深挖一下!
内容的提问来源于stack exchange,提问作者Jorel Amthor

