我的活动android:windowIsTranslucent
设置为true
,android:windowBackground
设置为半透明背景。我刚刚更改了目标并将sdk版本编译为27,现在启动此活动时出现异常:
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
由于这是一个新的sdk,目前还没有关于它的任何内容(它似乎来自这行代码:https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/Activity.java#987)
有没有办法解决这个问题?如果我从我的清单中取出android:screenOrientation="portrait"
用于此活动,该应用程序不会崩溃,但我希望能够保持这样。
答案 0 :(得分:27)
我也遇到了同样的问题。 正如其他人所说,如果我删除 android:screenOrientation =" portrait" 或用 android:screenOrientation ="未指定" 覆盖它,然后异常消失了。 并且前方活动的方向似乎遵循了背后活动的方向。
我想到了。 如果前方活动是透明的,并且后方活动的方向不同, 显示变得奇怪。 所以,我可以理解为什么添加这个检查逻辑 但是,我想知道为什么Developer Preview 8.0.0中没有出现这个问题。
答案 1 :(得分:16)
解决方法是将targetSdk
设置回26
。
此提交中您的应用程序崩溃的原因是here。
正如您所看到的here,您不是唯一的一个 - 此行为已被Google报告为问题。它已被修复,但我们不知道它将如何以及何时发布。
我还可以确认" sofakingforever"评论中说,如果在半透明后面有固定方向的非半透明活动,半透明将不会旋转。因此,您也可以从清单中删除android:screenOrientation="portrait"
。
答案 2 :(得分:4)
对我有用的解决方案是删除
android:screenOrientation="portrait"
来自所有全屏透明活动,这意味着其主题包含
<item name="android:windowIsTranslucent">true</item>
另外,为了确保定向在Oreo以下均正确,我将其添加到活动的onCreate()中。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This activity is a fullscreen transparent activity, so after Oreo Android doesn't allow fullscreen
// transparent activities to specify android:screenOrientation="portrait" in the manifest. It will pick up
// from the background activity. But for below Oreo we should make sure that requested orientation is portrait.
if (VERSION.SDK_INT < VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
答案 3 :(得分:3)
在目标版本27中,我只有这个问题,我通过使用下面的行解决了
<item name="android:windowIsTranslucent">false</item>
答案 4 :(得分:2)
所以我做的是从清单中删除任何screenOrientation属性并将其添加到我的BaseActivity(我的所有活动都扩展),此代码
if(!(this instanceof TranslucentActivity)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
TranslucentActivity将具有来自活动背后的方向。
答案 5 :(得分:1)
似乎它是API 27上的新功能/错误。 但是,您可以删除 机器人:screenOrientation 要么 机器人:screenOrientation =&#34;未指定&#34;
答案 6 :(得分:1)
我最近遇到了这个问题,这是解决方案。
无需更改您在android清单文件中设置的屏幕方向参数。
只需在其中添加两个文件夹
res>values
as res>values-v26
and res>values-v27
然后将您的styles.xml和themes.xml文件复制到那里。
并将以下参数从TRUE更改为FALSE。
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowIsTranslucent">false</item>
它将起作用。
Android 8.0的常见错误
答案 7 :(得分:0)
谢谢@JerabekJakub。我的测试结果 - 保留sdk 27并删除以下行也可以解决崩溃问题。
android:configChanges="orientation"
android:screenOrientation="portrait"
答案 8 :(得分:0)
1)删除此
android:screenOrientation="portrait"
来自minifyst.xml
2)在“活动”上添加这两行
protected void onCreate(Bundle savedInstanceState) {
setOrientation(this)
super.onCreate(savedInstanceState);
// other other all code here
}
3)只需将代码复制粘贴到您的活动中
public static void setOrientation(Activity context) {
if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.O)
context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
else
context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}