Блокировка ориентации экрана при ориентации на 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);
    }