Android 8.0 Only fullscreen activities can request orientation解决方法

Stars-one 2021年05月10日 86次浏览 本篇字数为1,828字

本文为作者原创,转载请注明出处,谢谢配合
作者:Stars-one
链接:https://stars-one.site/2021/05/10/android-8-bug


公司的项目坑太多,现在适配高版本的出现了上面的这个问题..

个人项目中我一般不对这个Activity朝向orientation属性进行更改

出现这个问题的原因是Android8.0的限制,只有全屏(fullscreen)的Activity才能去设置横/竖屏的方向,所以解决方法从下面几个方向入手

分析

从版本入手,降低版本,低版本没有这个限制

从Activity方向入手,取消设置横/竖屏(也就是AndroidMainfest中删除Activity的orientation的属性),或者是将Activity设置为全屏的

那么怎么知道Activity是不是属于全屏的,由下面的属性可以判断(定义在style文件里)

1.“windowIsTranslucent”为true;
2.“windowIsTranslucent”为false,但“windowSwipeToDismiss”为true;
3.“windowIsFloating“为true;

符合上面的某点规则的,说明Activity不是fullScreen

我们按照上面的规则,在styles.xml文件中定义好主题,之后给Activity设置即可

上面说的,可能项目的Activity过多,不好更改,还可以使用代码的方式,将Activity的orientation属性还原为默认值SCREEN_ORIENTATION_UNSPECIFIED(通过反射)

还有一点可以考虑,就是让非全屏的Activity的orientation属性设置behind,让它跟随上个Activity保持相同的屏幕方向即可

基于以上的分析,总结得出下面几种解决方法

解决方法

修改targetSdk版本

将build.gradle里的targetSdk修改为26以下(包含26)

设置Activity为全屏

通过定义style.xml属性,将Activity设置为全屏即可

1.“windowIsTranslucent”为true;
2.“windowIsTranslucent”为false,但“windowSwipeToDismiss”为true;
3.“windowIsFloating“为true;

符合上面的某点规则的,说明Activity不是fullScreen,按照上面的定义,反向设置即可,如

<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
	<item name="windowActionBar">false</item>
	<item name="windowNoTitle">true</item>
	<item name="windowIsTranslucent">false</item>
	<item name="windowSwipeToDismiss">false</item>
</style>

然后在AndroidManiFest.xml文件中,给Activity设置style属性,如

<activity
	android:name="com.tjsoft.advice.ui.More"
	android:screenOrientation="landscape"
	android:theme="@style/AppTheme" />

通过反射重置orientation

具体参考Only fullscreen activities can request orientation终极解决方法_LiteHeaven的专栏-CSDN博客,本人未测试过

设置orientation为behind

这种方法是将非fullscreen的Activity的orientation设置为behind,让其屏幕方向和上个Activity相同,这样就不会出现问题了

删除Activity设置的orientation属性

这个是终极大法,就是不给Activity设置orientation,那么就不会出现问题啦

参考