web-dev-qa-db-ja.com

不透明ではないアクティビティでAndroid AP​​I 27をターゲットにしたときに画面の向きをロックする

Android:windowIsTranslucenttrueに設定され、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"を取り出してもアプリはクラッシュしませんが、そのように保ちたいと思います。

35
vanshg

私も同じ問題に直面しました。他の人が言ったように、Android:screenOrientation = "portrait"を削除するかAndroid:screenOrientation = "unspecified"で上書きすると、例外はなくなりました。そして、前のアクティビティの方向は後ろのアクティビティの方向に従うようです。

私はそれについて考えました。前面のアクティビティが透明で、背面のアクティビティの向きが異なる場合、表示がおかしくなります。そのため、このチェックロジックが追加された理由を理解できますが、Developer Preview 8.0.0でこの問題が発生しなかったのはなぜでしょうか。

32
Takao Sumitomo

回避策は、targetSdk26に戻すことです。

アプリケーションがクラッシュする理由は、このコミットでは here です。

here を見るとわかるように、あなたはあなただけではありません-この動作は問題としてGoogleに報告されています。修正されましたが、いつどのようにリリースされるのかわかりません。


また、コメントで「sofakingforever」が何を言っているかを確認することができます。半透明の背後に固定方向の非半透明のアクティビティがある場合、半透明は回転しません。したがって、マニフェストからAndroid:screenOrientation="portrait"も削除できます。

17
JerabekJakub

私のために働いた解決策は削除しています

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);
    }
}
6
omersem

NoActionBarスタイルでこの行を変更することでこの問題を解決しました

ターゲットバージョン27でのみこの問題が発生し、以下の行を使用して解決しました

<item name="Android:windowIsTranslucent">false</item>
3
Venkatesh

だから、私はマニフェストからscreenOrientationプロパティを削除し、BaseActivity(すべてのアクティビティが拡張される)に追加しました、このコード

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

TranslucentActivityには、背後のアクティビティからの方向があります。

2
Diogo Rosa

aPI 27の新しい機能/バグのようです。ただし、Android:screenOrientationまたはAndroid:screenOrientation = "unspecified"を削除できます

1
Brahem Mohamed

ありがとう@JerabekJakub。私のテスト結果-SDK 27を保持し、次の行を削除してもクラッシュを解決できます。

 Android:configChanges="orientation"
 Android:screenOrientation="portrait"
0
flame3