Удаление андроида: screenOrientation = "портрет" должно быть достаточно

я есть деятельность, которая имеет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" из моего манифеста для этой деятельности, но я хотел бы быть в состоянии сохранить это так.

 sofakingforever05 нояб. 2017 г., 10:54
После некоторых экспериментов я обнаружил, что после удаления атрибута screenOrientation из аналогичных полупрозрачных операций мои действиявсе еще не будет вращаться, как те,позади них также есть атрибут screenOrientation спортрет стоимость.
 vanshg27 окт. 2017 г., 21:10
Так что мой вариант использования заключается в том, что эта полупрозрачная активность отображается только в моем собственном приложении (а не в виде наложения на другое приложение). Это действие поиска, которое накладывается на мою основную деятельность, основная деятельность также не вращается
 Gabe Sechan27 окт. 2017 г., 19:56
Нет смысла выбирать ориентацию с полупрозрачной активностью. Что если действие ниже вас не поддерживает это действие или заблокировало его самостоятельно? Как это будет работать? Если это когда-либо было позволено, это работало на лазейке.

Ответы на вопрос(7)

ил его в свой BaseActivity (из которого распространяются все мои действия), этот код

 if(!(this instanceof TranslucentActivity)){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

TranslucentActivity будет иметь ориентацию от действия позади.

 doctorram30 мар. 2018 г., 06:08
Для того, чтобы запросить ориентацию, задание также должно быть полноэкранным. Это очень запутанно, и мне очень не нравится в Android O. Вместо сбоя, который является большим изменением поведения, они должны были просто проигнорировать это (что тоже плохо!)
Решение Вопроса

если я удалиландроид: screenOrientation = "портрет" или переопределил егоандроид: screenOrientation = "неопределенные"Тогда исключение пропало. И кажется, что ориентация фронтовой деятельности следует за ориентацией задней деятельности.

Я думал об этом. Если фронтальная активность прозрачна и ориентация задней активности отличается, отображение становится странным. Итак, я могу понять, почему была добавлена ​​эта логика проверки. Однако мне интересно, почему эта проблема не возникла в Developer Preview 8.0.0.

 ShellDude27 дек. 2017 г., 21:27
Я согласен с этим ответом - однако я задаю вопрос, почему он ломается только на Oreo, так как Oreo MR1 в порядке.
 doctorram21 мар. 2018 г., 15:23
У меня нетscreenOrientation= где-нибудь в моем проекте, и этот сбой все еще происходит.
 Diogo Rosa27 мар. 2018 г., 15:11
@doctorram, может быть, у вас есть что-то подобное в вашем коде JavasetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
 doctorram28 мар. 2018 г., 04:31
@DiogoRosa, да, я делаю!
 Steve Yohanan31 янв. 2018 г., 18:32
имел прозрачную активность на вершине нашей основной деятельности. оба мероприятия были отмеченыandroid:screenOrientation="portrait", приложение зависнет, если на Android 8.0 с Target API 27. не возникнет проблем ни с Target API 26, ни с API 27 на Android 8.1 или 7.

Решение, работавшее для меня, удаляет

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);
    }
}
 omersem16 мар. 2019 г., 07:59
Если вам нужно заблокировать действие, так как оно наследует ориентацию от родительского действия, вам нужно заблокировать ориентацию родительского действия. Я сделал это, заблокировав ориентацию перед началом действия и освободив ориентацию после завершения прозрачного действия. Вы можете сделать это, запустив действие с кодом запроса и переопределив onActivityResult (). Проверьте код запроса, если это код запроса, который вы ожидаете, отпустите ориентацию.

что это новая функция / ошибка в API 27. Однако вы можете удалить android: screenOrientation Или android: screenOrientation = "unspecified"

 Kasas11 мар. 2019 г., 11:42
Это не ошибка, полупрозрачная активность действует как диалог, поэтому она имеет ту же ориентацию, что и родительская активность (та, которая ее начала)

targetSdk вернуться к26.

Причина, по которой ваше приложение падаетВот в этом коммите.

Как вы видетеВот, вы не единственный - об этом поведении было сообщено в Google как о проблеме. Это было исправлено, но мы не знаем, как и когда оно будет выпущено.

Я также могу подтвердить то, что «sofakingforever» говорит в комментариях, если есть непрозрачная активность с фиксированной ориентацией позади вашего полупрозрачного, полупрозрачный не будет вращаться. Так что вы можете просто удалитьandroid:screenOrientation="portrait" из манифеста, а также.

 heeleeaz09 апр. 2018 г., 08:27
В настоящее время лучшим решением является изменение значения targetSdk на 26. Это проблема, выпущенная Google, которая будет исправлена ​​в новой версии - 2 ноября 2017 г., 07:47 Помечено как исправленное Наша команда инженеров исправила эту проблему. Он будет доступен в будущем выпуске Android, поэтому следите за заметками о выпуске.
 JerabekJakub14 февр. 2018 г., 14:28
@HarishVishwakarma Да, вы абсолютно правы. Поэтому я изменил слово «решение» на «обходной путь». И это не навсегда, потому что Google будет принудительно загружать новый APK в GPlay для нацеливания на последний API.
 Harish Vishwakarma13 февр. 2018 г., 08:02
Это не настоящее решение. Если кто-то нацелен на API 27, это не просто так.
Я решил эту проблему, изменив эту строку в стилях NoActionBar

строки ниже

<item name="android:windowIsTranslucent">false</item>
 Sakthi26 февр. 2019 г., 14:41
Не получаю ошибок, возникли проблемы с дизайном. Если экран в горизонтальном режиме после поворота, получается портретный дизайн.
 Venkatesh26 февр. 2019 г., 08:17
какую ошибку ты получаешь ?? @ Sakthi
 Sakthi26 февр. 2019 г., 07:47
Не работает для этого.
 Venkatesh26 февр. 2019 г., 08:03
?? что значит @Sakthi
 Sakthi26 февр. 2019 г., 08:07
Я использовал <item name = "android: windowIsTranslucent"> false </ item> в файле style.xml. Но не решил мою проблему.

следующие строки, которые также могут решить проблему.

 android:configChanges="orientation"
 android:screenOrientation="portrait"
 JerabekJakub21 нояб. 2017 г., 08:13
Но это приведет к повороту экрана, чего мы не хотим.
 Ranjith Kumar20 нояб. 2017 г., 15:42
причина удаления configChanges ??
 flame321 нояб. 2017 г., 09:54
Я проверил мой согласно описанию JerabekJakub - если есть непрозрачная активность с фиксированной ориентацией позади вашего полупрозрачного, полупрозрачный не будет вращаться.
 Vall0n08 февр. 2018 г., 16:13
Удаление андроида: screenOrientation = "портрет" должно быть достаточно

Ваш ответ на вопрос