Блокировка ориентации экрана при ориентации на Android API 27 с непрозрачной активностью
У меня есть активность, у которой 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"
из моего манифеста для этого действия, но я хотел бы иметь возможность сохранить его таким образом.
Ответы
Ответ 1
Я также столкнулся с той же проблемой.
Как говорили другие, если я удалил android: screenOrientation = "portrait" или переопределил его с помощью android: screenOrientation = "unspecified" , тогда исключение исчезло.
И, похоже, ориентация передней активности следует за направленной ориентацией деятельности.
Я подумал об этом.
Если передняя активность прозрачна и ориентация позади отличается,
дисплей становится странным.
Итак, я могу понять, почему эта логика проверки была добавлена
Однако мне интересно, почему эта проблема не возникла в Developer Preview 8.0.0.
Ответ 2
Обходной путь должен установить targetSdk
обратно на 26
.
Причина сбоя приложения в здесь в этом коммите.
Как вы можете видеть здесь, вы не единственный - такое поведение было сообщено в Google как проблема. Это было исправлено, но мы не знаем, как и когда оно будет выпущено.
Я также могу подтвердить то, что "sofakingforever" говорит в комментариях, если есть непрозрачная активность с фиксированной ориентацией позади вашего полупрозрачного, полупрозрачный не будет вращаться. Так что вы можете просто удалить android:screenOrientation="portrait"
из манифеста.
Ответ 3
Решение, которое сработало для меня - это удаление
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 does not 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);
}
}
Ответ 4
Я решил эту проблему, изменив эту строку в стилях NoActionBar
Только в целевой версии 27 я получил эту проблему и решил ее с помощью строки ниже
<item name="android:windowIsTranslucent">false</item>
Ответ 5
Поэтому я удалил любое свойство screenOrientation из манифеста и добавил его в свой BaseActivity (из которого распространяются все мои действия), этот код
if(!(this instanceof TranslucentActivity)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
TranslucentActivity будет иметь ориентацию из действия позади.
Ответ 6
Похоже, это новая функция/ошибка в API 27.
Тем не менее, вы можете удалить
андроид: screenOrientation
Или же
андроид: screenOrientation = "неопределенные"
Ответ 7
Спасибо @JerabekJakub. Мой результат теста - держите sdk 27 и удалите следующие строки, также можете решить проблему.
android:configChanges="orientation"
android:screenOrientation="portrait"
Ответ 8
1) Удалить это
android:screenOrientation="portrait"
из minizest.xml
2) в Activity добавьте эти две строки
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);
}