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

本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/14750188.html

本篇大约有2134个字,阅读预计需要2.67分钟


原文:Android 8.0 Only fullscreen activities can request orientation解决方法 | Stars-One的杂货小窝

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

个人项目中我一般不对这个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,那么就不会出现问题啦

参考

posted @   Stars-one  阅读(635)  评论(0)    收藏  举报
编辑推荐:
· 为 Java 虚拟机分配堆内存大于机器物理内存会怎么样?
· .NET程序启动就报错,如何截获初期化时的问题json
· 理解 C# 中的各类指针
· C#多线程编程精要:从用户线程到线程池的效能进化论
· 如何反向绘制出 .NET程序 异步方法调用栈
阅读排行:
· 换个方式用C#开发微信小程序
· .NET程序启动就报错,如何截获初期化时的问题json
· Java Solon v3.3.0 发布(国产优秀应用开发基座)
· AI 技术发展简史
· SpringAI更新:废弃tools方法、正式支持DeepSeek!
历史上的今天:
2019-05-10 oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架
点击右上角即可分享
微信分享提示