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"
в таблице строк. Ссылки разные, но контент один и тот же.
Возможно, вы показываете Activity, похожее на Dialog (не полноэкранный), поэтому удалите ScreenOrientation из манифеста или из кода. Это устранит проблему.
Многие люди дали исправление, поэтому я расскажу об источнике проблемы.
Согласно журналу исключений:
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 или удалить связанные атрибуты темы в соответствии с вашими нуждается.
Если вы не решили свою проблему, просто зарегистрируйте активность объявления в манифесте следующим образом:
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"
/>
Вам также необходимо обновить до последней версии sdk.
Если вы используете полноэкранную прозрачную активность, нет необходимости указывать блокировку ориентации для этой активности. Это займет настройки конфигурации родительской активности. Итак, если родительская активность имеет в манифесте:
android: screenOrientation = "portrait"
blockquote>, ваша полупрозрачная активность будет иметь одинаковую блокировку ориентации: портрет.
Я не могу согласиться на наиболее рейтинговый ответ, потому что
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
вызывает ошибку
java.lang.IllegalStateException: только непрозрачные действия в полноэкранном режиме могут запрашивать ориентацию
blockquote>, но это заставляет меня работать для меня
<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" />
Google выбрасывает это исключение по методу onCreate
для Activity после v27, их значение: если Activity является полупрозрачным или плавающим, его ориентация должна основываться на родительской (фоновой) деятельности, не может принимать решения сама по себе.
Даже если вы удаляете android:screenOrientation="portrait"
из плавающей или полупрозрачной активности, но фиксируете ориентацию в своей родительской (фоновой) деятельности, она по-прежнему фиксируется родителем, я уже тестировал.
Одна особая ситуация: если вы делаете полупрозрачный объект активности, он не имеет родительского фона (фона), поэтому всегда вращайте его с помощью устройства. Хотите исправить это, вы должны по-другому заменить стиль <item name="android:windowIsTranslucent">true</item>
.
в файле манифеста устанавливает второе действие 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" />
в 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);
}
В Android O и позже эта ошибка возникает, когда вы устанавливаете
android:screenOrientation="portrait"
в манифесте.
Удалите эту строку и используйте
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
в вашей деятельности.
Это устранит вашу проблему.
<item name="android:windowIsTranslucent">true</item>
из моего стиля, который наследуется от Theme.AppCompat.Light.NoActionBar
, работал для меня.
– shadowsheep
29 January 2018 в 11:51
Единственное решение, которое действительно работает:
Изменить:
<item name="android:windowIsTranslucent">true</item>
на:
<item name="android:windowIsTranslucent">false</item>
в styles.xml
Но это может вызвать проблемы с вашим заставкой (белый экран при запуске) ... Удачи! :)
Последняя вероятность: целевой SDK 26, а не 27. И ждите SDK 28, который должен исправить эту проблему (обычно!) [/ g5]
Я не знаю, является ли это ошибкой от Google или предполагаемым поведением, но я (по крайней мере на мгновение) решил его, изменив compileSdkVersion и targetSdkVersion на 26 в Gradle ...
это произошло после 27, использование targetSdkVersion 26 заменить, дождаться, когда Google зафиксировал его