requestOrientation in Translucent Activities in Oreo (Только действия в полноэкранном режиме могут запрашивать ориентацию) [дублировать]

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

64
задан Shubham Sejpal 3 January 2018 в 07:41
поделиться

19 ответов

0
ответ дан Debasish Ghosh 29 October 2018 в 04:11
поделиться

Возможно, вы показываете Activity, похожее на Dialog (не полноэкранный), поэтому удалите ScreenOrientation из манифеста или из кода. Это устранит проблему.

0
ответ дан Balflear 15 August 2018 в 21:05
поделиться
  • 1
    Нет, это не работает для меня, я уже пробовал. – Shubham Sejpal 17 April 2018 в 15:55
  • 2
    Хм, очень странно, для меня это было так. Попробуйте запустить приложение на разных версиях Android, посмотрите, что будет результатом этого, что может вам помочь ... – Balflear 18 April 2018 в 07:20

Многие люди дали исправление, поэтому я расскажу об источнике проблемы.

Согласно журналу исключений:

Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
    at android.app.Activity.onCreate(Activity.java:1081)
    at android.support.v4.app.SupportActivity.onCreate(SupportActivity.java:66)
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:297)
    at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
    at com.nut.blehunter.ui.DialogContainerActivity.onCreate(DialogContainerActivity.java:43)
    at android.app.Activity.performCreate(Activity.java:7372)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 
    at android.app.ActivityThread.-wrap12(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 
    at android.os.Handler.dispatchMessage(Handler.java:108) 
    at android.os.Looper.loop(Looper.java:166)

Код, который вызвал исключение в Activity.java

    //Need to pay attention mActivityInfo.isFixedOrientation() and ActivityInfo.isTranslucentOrFloating(ta)
    if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) {
        final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
        final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
        ta.recycle();

        //Exception occurred
        if (isTranslucentOrFloating) {
            throw new IllegalStateException(
                    "Only fullscreen opaque activities can request orientation");
        }
    }

mActivityInfo.isFixedOrientation ():

        /**
        * Returns true if the activity's orientation is fixed.
        * @hide
        */
        public boolean isFixedOrientation() {
            return isFixedOrientationLandscape() || isFixedOrientationPortrait()
                    || screenOrientation == SCREEN_ORIENTATION_LOCKED;
        }
        /**
        * Returns true if the activity's orientation is fixed to portrait.
        * @hide
        */
        boolean isFixedOrientationPortrait() {
            return isFixedOrientationPortrait(screenOrientation);
        }

        /**
        * Returns true if the activity's orientation is fixed to portrait.
        * @hide
        */
        public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
            return orientation == SCREEN_ORIENTATION_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
        }

        /**
        * Determines whether the {@link Activity} is considered translucent or floating.
        * @hide
        */
        public static boolean isTranslucentOrFloating(TypedArray attributes) {
            final boolean isTranslucent = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent, false);
            final boolean isSwipeToDismiss = !attributes.hasValue(com.android.internal.R.styleable.Window_windowIsTranslucent)
                                            && attributes.getBoolean(com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
            final boolean isFloating = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);
            return isFloating || isTranslucent || isSwipeToDismiss;
        }

Согласно приведенному выше анализу кода, когда TargetSdkVersion> = 27 при использовании SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT, и другие связанные атрибуты, использование атрибутов темы windowIsTranslucent, windowIsFloating и windowSwipeToDismiss вызовет исключение.

После обнаружения проблемы вы можете изменить TargetSdkVersion или удалить связанные атрибуты темы в соответствии с вашими нуждается.

3
ответ дан Bingerz 15 August 2018 в 21:05
поделиться

Если вы не решили свою проблему, просто зарегистрируйте активность объявления в манифесте следующим образом:

<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"
 />

Вам также необходимо обновить до последней версии sdk.

0
ответ дан Gardax 15 August 2018 в 21:05
поделиться

Если вы используете полноэкранную прозрачную активность, нет необходимости указывать блокировку ориентации для этой активности. Это займет настройки конфигурации родительской активности. Итак, если родительская активность имеет в манифесте:

android: screenOrientation = "portrait"

, ваша полупрозрачная активность будет иметь одинаковую блокировку ориентации: портрет.

11
ответ дан gellyke 15 August 2018 в 21:05
поделиться
  • 1
    Очень ценю этот ответ. Я столкнулся с этим вопросом уже давно. – Raj Suvariya 12 June 2018 в 14:14
  • 2
    Рад, что это помогло @ RajSuvariya – gellyke 5 July 2018 в 07:17
  • 3
    Я думаю, что вы сделали небольшую опечатку: должно быть «если вы используете полноэкранную полупрозрачную активность, она примет настройку конфигурации своей родительской активности & quot; ^^ – Josselin 12 July 2018 в 19:43
  • 4
    Что делать, если моя прозрачная активность - это моя активность запуска (т. Е. Экран заставки) – Bhupesh 27 July 2018 в 13:21
  • 5

Я не могу согласиться на наиболее рейтинговый ответ, потому что

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

вызывает ошибку

java.lang.IllegalStateException: только непрозрачные действия в полноэкранном режиме могут запрашивать ориентацию

, но это заставляет меня работать для меня

<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

и использовать его для вашей деятельности, когда вы выходите из

InterstitialActivity extends AppCompatActivity

в AndroidManifest.xml

    <activity
        android:name=".InterstitialActivity"
        ...
        android:screenOrientation="portrait"
        android:theme="@style/TranslucentTheme" />
4
ответ дан hannes ach 15 August 2018 в 21:05
поделиться
  • 1
    & lt; item name = "android: windowIsTranslucent" & gt; ложь & lt; / item & gt; & lt; item name = "android: windowFullscreen" & gt; true & lt; / item & gt; = & GT; это исправило это для меня на android 8.0. В манифесте я все еще могу оставить экран. – Frank 8 May 2018 в 10:02

Google выбрасывает это исключение по методу onCreate для Activity после v27, их значение: если Activity является полупрозрачным или плавающим, его ориентация должна основываться на родительской (фоновой) деятельности, не может принимать решения сама по себе.

Даже если вы удаляете android:screenOrientation="portrait" из плавающей или полупрозрачной активности, но фиксируете ориентацию в своей родительской (фоновой) деятельности, она по-прежнему фиксируется родителем, я уже тестировал.

Одна особая ситуация: если вы делаете полупрозрачный объект активности, он не имеет родительского фона (фона), поэтому всегда вращайте его с помощью устройства. Хотите исправить это, вы должны по-другому заменить стиль <item name="android:windowIsTranslucent">true</item>.

27
ответ дан Mateus Gondim 15 August 2018 в 21:05
поделиться

в файле манифеста устанавливает второе действие parentActivityName как первое действие и удаляет параметр screenOrientation во второе действие. это означает, что ваша первая деятельность является родителем и решит ориентацию вашего второго занятия.

<activity
        android:name=".view.FirstActiviy"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" />

<activity
        android:name=".view.SecondActivity"
        android:parentActivityName=".view.FirstActiviy"
        android:theme="@style/AppTheme.Transparent" />
1
ответ дан mustafa.ertrk 15 August 2018 в 21:05
поделиться

в android Oreo вы не можете изменить oritation для Activity, которые имеют строку ниже в стиле

 <item name="android:windowIsTranslucent">true</item>

Сначала вы должны удалить нижнюю строку из манифеста для этого действия

android:screenOrientation="portrait"

Во-вторых, вы должны добавить эту строку в java-файл

    //android O fix bug orientation
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
7
ответ дан Radesh 15 August 2018 в 21:05
поделиться

В Android O и позже эта ошибка возникает, когда вы устанавливаете

 android:screenOrientation="portrait"

в манифесте.

Удалите эту строку и используйте

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

в вашей деятельности.

Это устранит вашу проблему.

37
ответ дан Ragesh Ramesh 15 August 2018 в 21:05
поделиться
  • 1
    Его ошибка с стороны Google. Должны быть исправлены в будущих обновлениях. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); будет ограничивать ваше приложение перемещением в ландшафт. Убедитесь, что вы используете это для создания всех ваших действий. – Ragesh Ramesh 12 January 2018 в 08:31
  • 2
    Удаление <item name="android:windowIsTranslucent">true</item> из моего стиля, который наследуется от Theme.AppCompat.Light.NoActionBar, работал для меня. – shadowsheep 29 January 2018 в 11:51
  • 3
    Это решение работает, но оно испортило мой splashScreenTheme. Позор в Google для частых неаккуратных выходов ... – doctorram 5 March 2018 в 18:13
  • 4
    Замена атрибута манифеста путем установки ориентации в классе Activity не решает проблему. – rmgoncalo 6 April 2018 в 10:14
  • 5
    Это не работает для меня – Subin Babu 15 May 2018 в 07:13

Единственное решение, которое действительно работает:

Изменить:

<item name="android:windowIsTranslucent">true</item>

на:

<item name="android:windowIsTranslucent">false</item>

в styles.xml

Но это может вызвать проблемы с вашим заставкой (белый экран при запуске) ... Удачи! :)

Последняя вероятность: целевой SDK 26, а не 27. И ждите SDK 28, который должен исправить эту проблему (обычно!) [/ ​​g5]

5
ответ дан Regis_AG 15 August 2018 в 21:05
поделиться
  • 1
    Изменение целевого SDK на 26 вместо 27 работало на меня. Изменение окнаIsTranslucent не было. – Cliche818 18 June 2018 в 16:19
  • 2
    UPDATE: использование targetSDK до 28 не работает :) – Luca Nicoletti 1 August 2018 в 13:07

Я не знаю, является ли это ошибкой от Google или предполагаемым поведением, но я (по крайней мере на мгновение) решил его, изменив compileSdkVersion и targetSdkVersion на 26 в Gradle ...

0
ответ дан Seven 15 August 2018 в 21:05
поделиться
  • 1
    Вы не должны понижать уровень targetdk. В конечном итоге ваше приложение будет заблокировано из магазина воспроизведения. Всегда настройте целевой уровень Android Api android-developers.googleblog.com/2017/12/… – Shmuel 19 April 2018 в 19:30
  • 2
    @ Шмуэль: неправильно. Вы можете настроить таргетинг 26 и быть доступным на 28 в магазине. – Regis_AG 1 June 2018 в 15:10
  • 3
    Правильно, я написал «в конце концов», если вы создадите приложение, ориентируясь на более старый уровень api, и вы будете в мире боли, когда вы будете вынуждены обновлять – Shmuel 1 June 2018 в 21:21

это произошло после 27, использование targetSdkVersion 26 заменить, дождаться, когда Google зафиксировал его

0
ответ дан yihang wu 15 August 2018 в 21:05
поделиться
  • 1
    При отправке ответа укажите любую ссылку (ссылку или цитату). Поэтому будущие пользователи могут легко понять. Также, добро пожаловать в SO Community . – Mohammedsalim Shivani 18 July 2018 в 04:15
0
ответ дан Attaullah 5 September 2018 в 20:34
поделиться
-1
ответ дан Michael Myers 5 September 2018 в 20:34
поделиться
1
ответ дан Hamza Khan 29 October 2018 в 04:11
поделиться
0
ответ дан Najib Puthawala 29 October 2018 в 04:11
поделиться
0
ответ дан NaturallyAsh 29 October 2018 в 04:11
поделиться
3
ответ дан Paul 29 October 2018 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: