java.lang.IllegalStateException:全画面の不透明なアクティビティのみが向きを要求できます


187

Android 8.0 Oreo java.lang.IllegalStateException:フルスクリーンの不透明なアクティビティのみがオリエンテーションをリクエストできるので、連絡帳から連絡先を取得しているときに問題に直面しています

私は電話連絡帳から私の活動の連絡先を取得しようとしています、それはロリポップ、マシュマロ、ヌガーなどに最適ですが、このようなオレオのエラーが発生します。助けてください。私のコードは以下にあります。

デモコード:-

private void loadContacts() {
            contactAsync = new ContactLoaderAsync();
            contactAsync.execute();
        }

        private class ContactLoaderAsync extends AsyncTask<Void, Void, Void> {
            private Cursor numCursor;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Uri numContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
                String[] numProjection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
                if (android.os.Build.VERSION.SDK_INT < 11) {
                    numCursor = InviteByContactActivity.this.managedQuery(numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                } else {
                    CursorLoader cursorLoader = new CursorLoader(InviteByContactActivity.this, numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                    numCursor = cursorLoader.loadInBackground();
                }

            }

            @Override
            protected Void doInBackground(Void... params) {
                if (numCursor.moveToFirst()) {
                    try {
                        final int contactIdIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                        final int displayNameIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        final int numberIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        final int typeIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                        String displayName, number, type;
                        do {
                            displayName = numCursor.getString(displayNameIndex);
                            number = numCursor.getString(numberIndex);
                            type = getContactTypeString(numCursor.getString(typeIndex), true);
                            final ContactModel contact = new ContactModel(displayName, type, number);
                            phoneNumber = number.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");

                            if (phoneNumber != null || displayName != null) {
                                contacts.add(phoneNumber);
                                contactsName.add(displayName);
                                contactsChecked.add(false);

                                filterdNames.add(phoneNumber);
                                filterdContactNames.add(displayName);
                                filterdCheckedNames.add(false);
                            }
                        } while (numCursor.moveToNext());
                    } finally {
                        numCursor.close();
                    }
                }


                Collections.sort(contacts, new Comparator<String>() {
                    @Override
                    public int compare(String lhs, String rhs) {
                        return lhs.compareToIgnoreCase(rhs);
                    }
                });

                InviteByContactActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mContactAdapter.notifyDataSetChanged();
                    }
                });

                return null;
            }
        }

        private String getContactTypeString(String typeNum, boolean isPhone) {
            String type = PHONE_TYPES.get(typeNum);
            if (type == null)
                return "other";
            return type;
        }

        static HashMap<String, String> PHONE_TYPES = new HashMap<String, String>();

        static {
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "", "home");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "", "mobile");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "", "work");
        }
}

エラーログ:-

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
                                                              Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation


1
これはあなたが助けることstackoverflow.com/questions/46980697/...
Nilesh Rathod

同様に、この点を確認してください。stackoverflow.com/questions/46980697/...
yash786

1
すべての提案を試みましたが、誰も私のために働いていません。
Shubham Sejpal

1
マニフェストでandroid:screenOrientation = "portrait"を使用していますか?
Ragesh Ramesh 2018

回答:


63

ターゲットsdkが28のときに問題が発生しているようです。多くのオプションを試した後、ようやくこれが機能しました。

<activity
            android:name=".activities.FilterActivity"
            android:theme="@style/Transparent"
            android:windowSoftInputMode="stateHidden|adjustResize" />

スタイル:-

<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowIsTranslucent">true</item>
     <item name="android:windowBackground">@android:color/transparent</item>
     <item name="android:windowIsFloating">true</item>
     <item name="android:windowContentOverlay">@null</item>
     <item name="android:windowNoTitle">true</item>
     <item name="android:backgroundDimEnabled">false</item>
 </style>

注:parent = "Theme.AppCompat.Light.NoActionBar"はapi 28に必要です。以前はapi 26で何か他のものを持っていました。うまく機能していましたが、28で問題を起こし始めました。誰かがここで役立つことを願っています。編集:一部の<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> 場合は、workedを設定することによってのみ機能します。ソリューションの実装方法が機能するかどうかに依存する場合があります。


22
この「修正」に遭遇した他の人には、私が設定<item name="android:windowIsTranslucent">false</item>しなければならず<item name="android:windowIsFloating">false</item>、それが機能する前に設定しなければなりませんでした。
th317erd

8
これに対する解決策はどこにありますか?タグにはscreenOrientation属性がなく、trueに設定されているactivityときにクラッシュを引き起こす唯一のものが設定されています。screenOrientationandroid:windowIsTranslucent
アンドロイド開発者

上記のコメントを使用しない限り、これは機能しません。上記のコメントをカバーRadesh、で答えを参照してください、そしてより多くの、そして明確である
アーベルク

私のために半透明をfalseに設定すると<item name = "android:windowIsTranslucent"> false </ item>
Tran Quan

私の場合、解決策は、AndroidManifest.xmlのアクティビティから「android:theme」を削除することでした。ただし、必要な場合は、「super.onCreate」の前にプログラムで追加できます。setTheme(R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin

133

Android Oreo(API 26)では、スタイルの下に線があるアクティビティの向きを変更できません

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

または

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

これを解決するにはいくつかの方法があります。

1)上記の行を削除(またはfalseに変更)するだけで、アプリは正常に動作します。

2) または、最初にそのアクティビティのマニフェストから以下の行を削除できます

android:screenOrientation="portrait"

次にこの行をアクティビティに追加する必要があります(onCreate()内)

    //android O fix bug orientation
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

3)新しい作成することができますstyles.xmlでのvalues-v26フォルダとあなたにこれを追加しますstyle.xml。(AbdelHadyコメントに感謝)

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

25
Android PIEでは、これは期待どおりに機能します。したがって、チェックは実際に次のようになりますandroid.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
。– Entreco

@avisperは、完全な条件コードを共有していただけませんか
Manikandan K '

API 26を実行しているデバイス/エミュレーターでは、オプション2は機能しません。そのAPIのみを無効にするには、新しいを作成する必要がありましstyles.xmlた。values-v26android:windowIsTranslucent
AbdelHady

@AbdelHady良い解決策、私はそれを私の答えに追加しますが、コードをチェックし、オプション2が機能しない理由を細かくチェックします。その提案されたオプション
Radesh

1
私はブール値でオプション3を使用し、<bool name="allowWindowFullScreenTranslucent">true</bool>それをで参照しました<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>。次に、styles.xmlでvalues-v26の下に設定しfalse、valuesとvalues-v27でに設定しtrueます。
drorsun

87

Android O以降では、このエラーは

 android:screenOrientation="portrait"

マニフェストで。

その行を削除して使用します

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

あなたの活動で。

これで問題が解決します。


7
グーグル側からのバグです。今後のアップデートで修正される予定です。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); アプリが横向きになるのを制限します。すべてのアクティビティの作成時にこれを使用してください。
Ragesh Ramesh

44
削除 <item name="android:windowIsTranslucent">true</item>から継承というのが私のスタイルから、Theme.AppCompat.Light.NoActionBar 私のために働きました。
シャドウシープ2018年

16
このソリューションは機能しますが、splashScreenThemeがめちゃくちゃになります。頻繁にずさんなロールアウトが発生した場合のGoogleでの恥...
doctorram

3
以前のバージョンで動作していたアプリを壊すことを「意図」していますか?その目標は確実に達成されました。@Rageshのおかげで、少なくとも私たちには解決策があります
Oleg Gryb 2018年

9
Activityクラスで方向を設定してマニフェスト属性を置き換えても問題は解決しません。
rmgoncalo 2018

75

GoogleはonCreatev27の後でActivityのメソッドにこの例外をスローします。その意味は次のとおりです。Activityが半透明またはフローティングの場合、その方向は親(背景)Activityに依存する必要があり、それ自体で決定を下すことはできません。

android:screenOrientation="portrait"フローティングアクティビティまたは半透明アクティビティから削除しても、親(バックグラウンド)アクティビティの向きを修正しても、親によって修正されますが、すでにテストしました。

特別な状況の1つ:ランチャーアクティビティを半透明にすると、親(背景)がないため、常にデバイスと一緒に回転します。修正したいのですが、<item name="android:windowIsTranslucent">true</item>スタイルを置き換えるには別の方法をとる必要があります。


2
Android PIEを実行しているOnePlusでは、この問題は発生しません。したがって、v27以降ではなく、v!= 28の場合
Entreco

これに関するドキュメントへのリンクがありますか?見つけられないようです。
Shivam Verma

半透明の問題は本当にクレイジーです。おかげで、問題が解決しました
Abhishek Garg

最後のセクション「1つの特別な状況...」に注目していただきありがとうございます
guy_m

これは受け入れられる答えになるはずです。完全に理にかなっています!
stoefln

29

全画面透過アクティビティを使用する場合、アクティビティに方向ロックを指定する必要はありません。親アクティビティの構成設定を取得します。したがって、親アクティビティがマニフェストにある場合:

android:screenOrientation = "portrait"

半透明のアクティビティは同じ向きにロックされます:縦向き。


私はあなたが小さなタイプミスをしたと思います:「フルスクリーンの半透明のアクティビティを使用する場合、親アクティビティの構成設定が使用されます」^^
Josselin

2
私の透明なアクティビティがランチャーアクティビティ(スプラッシュスクリーンなど)である場合
Bhupesh

2
これはすべてのAndroidバージョンに当てはまりますか?それともAndroid O以上のみですか?
abhiank 2018

ただし、これが使用されている唯一のアクティビティである場合は機能しません(例:サービスから開始)
android developer

24

android:screenOrientation="behind"代わりに使用しましたandroid:screenOrientation="portrait"。基本的に、(アクティビティ内に)ダイアログを作成し、ダイアログはそれ自体では向きを要求できません。これを行うには親アクティビティが必要です(親はバックグラウンドで表示され、独自のレイアウトがあるため)。

「背後」アクティビティスタックでアクティビティのすぐ下にあるアクティビティと同じ方向。


作成したアクティビティを透明にし、その下にあるもの(他のアプリを含む)を表示しながら、現在の向きも維持したい場合はどうすればよいですか?「背後」に置いたままにしておくと、さまざまなケースで向きが変わる可能性があります...
android developer

19

実際に機能する唯一のソリューション:

変化する:

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

に:

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

styles.xml

しかし、これはスプラッシュスクリーン(起動時の白い画面)に問題を引き起こす可能性があります...この場合、次の行をstyles.xmlに追加します。

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

windowIsTranslucent行のすぐ下。

前のヒントが機能しない場合の最後のチャンス:ターゲットSDK 26ではなくo 27。


1
ターゲットSDKを27ではなく26に変更するとうまくいきました。windowIsTranslucentを変更しませんでした。
Cliche818

これは、targetSDK:27を使用して動作しました。スプラッシュスクリーンを構成したので、これは特に重要です。
Leonardo G.

18

を使用する必要がある場合setRequestedOrientation()、Android 8.0でwindowIsTranslucent属性を犠牲にする以外に方法はありません。

values\styles.xml APIレベル25-(<8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
        ...
        <item name="android:windowIsTranslucent">true</item>
        ...
    </style>

values-v26\styles.xml APIレベル26(= 8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <!-- android 8.0(api26),Only fullscreen opaque activities can request orientation -->
    <item name="android:windowIsTranslucent">false</item>
    ...
</style>

values-v27\styles.xml APIレベル27以上(> 8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <item name="android:windowIsTranslucent">true</item>
    ...
</style>

14

多くの人々が修正を与えたので、問題の原因について話しましょう。

例外ログによると:

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を変更するか、テーマの関連属性を削除できます。


1
この時点でマスター上のコードを確認すると、すでにフレームワークから削除されています。
エリックM.スプレンゲル2018

この部分のソースコードへのリンクを見せていただけますか?特定の向きのアクティビティと透明な背景を使用して、その背後にあるもの(他のアプリを含む)を確認できるようにする回避策はありますか?
android開発者

8

最も評価された回答に同意できません。

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" />

<item name = "android:windowIsTranslucent"> false </ item> <item name = "android:windowFullscreen"> true </ item> =>これにより、android 8.0で修正されました。まだマニフェストにscreenOrientationを残すことができました。
フランク

1
これはwindowIsTranslucentと同じようには機能しません。これは、アクティビティの背後にあるものを確認できないためです。
Android開発者、

8

android:screenOrientation="portrait"Manifiest.xmlでこのアクティビティ行を削除するだけです

そのアクティビティは前のアクティビティから向きを取得するため、を持って<item name="android:windowIsTranslucent">true</item>いる向きを適用する必要はありません。


以前のアクティビティの向きが現在のアクティビティで必要なものと異なる場合はどうなりますか?
ClassA 2019年

6

ターゲットSDKがパイ(APIレベル28.0)で、windowIsTranslucentがtrueの場合に表示される

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

そして、あなたはオリエンテーションにアクセスしようとします。問題はandroid oreo 8.0(APIレベル26)に付属しています。これを解決するには2つの方法があります。

  1. 向きを削除する
  2. またはwindowIsTranslucentをfalseに設定します

このようにマニフェストで方​​向を設定している場合

android:screenOrientation="portrait"

またはこのような活動クラスで

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

両方の場所からフォームを削除します。

そして、uがwindowIsTranslucentをtrueに設定すると、親アクティビティから方向を取得します。


5

マニフェストファイルで、2番目のアクティビティparentActivityNameを最初のアクティビティとして設定し、screenOrientationパラメータを2番目のアクティビティから削除します。これは、最初のアクティビティが親であり、2番目のアクティビティの方向を決めることを意味します。

<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" />

5

Manifiest.xmlでアクティビティの方向を設定するだけ

android:screenOrientation="unspecified"

または縦向きに限定

例えば、onCreate前にメソッド呼び出しで、アクティビティで使用することもできますsuper.onCreate(...)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        setOrientation(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_xml_layout);
        //...
        //...
}

// Method 
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);
}

4

私は同じ問題を抱えていました、そして私の解決策はラインを排除することでした

android:screenOrientation="portrait"

そして、これをアクティビティに追加します:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

1
スタックオーバーフローでは英語を使用してください。ありがとう!
マイケルマイヤーズ

3

調査したところ、この問題はGoogleのバグが原因である可能性があります。私にとっては、この行をアクティビティのonCreateメソッドに残すことができました。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

そして、targetSdkVersionを26に変更しました。onCreateにその行があると、クラッシュが発生しましたが、targetSdkVersionが27に設定されています。これまでのところ、他の解決策はうまくいかなかったので、これは一時的な修正として機能することがわかりました今。


1
これは、targetSdkVersionを26、android:screenOrientation = "portrait"および<item name = "android:windowIsTranslucent"> true </ item>に設定することで機能しました
siripan '19年

あまりにも私のために@siripan
Acauãピッタ

しかし、最終的には今年、targetSdkVersionを28に設定する必要があります:support.google.com/googleplay/android-developer/answer/…。あなたは何をしますか?
アンドロイドデベロッパー

3

Androidバージョン7(APIレベル24、25)および8(APIレベル26、27)のstyle.xmlファイル内のテーマ間の競合(バグ)です。

android:screenOrientation="portrait" :AndroidManifest.xmlの特定のアクティビティ(クラッシュ)内

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

style.xml内のそのアクティビティに適用されたテーマ

必要に応じて、次の方法で解決できます。

1-競合する上記のプロパティを削除します

2-必要に応じて、アクティビティの方向をこれらの値のいずれかに変更します。unspecifiedまたはbehind、ここで見つけることができるなど:android:screenOrientationのGoogleリファレンス `

3-実行時にプログラムで向きを設定する


このソリューションを試してみましたが、アプリはまだクラッシュします。縦向きの透明なアクティビティが必要なので、この両方のオプションが必要です。マニフェストscreenOrientationでセットを試しましたが、運がありませんでした。
anber

いいえ。マニフェストの向きをすべて削除して、アクティビティを全画面表示にしようとしましたが、それでもクラッシュします。1つのデバイスのみ-9 liteを尊重します。Samsungでは問題なく動作します。
anber

プログラムで方向を設定すると、クラッシュも発生します。どのように正確に使用しましたか?
アンドロイドデベロッパー

@androiddeveloperソースコードにアクセスするにはどうすればよいですか。私はあなたが何をしたかを見なければなりません
ハメド・ジャリアーニ

@HamedJalilianiプログラムで設定することは、たとえば次のようになります。`setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); `
Android開発者

3

私は最近問題に直面しました、そしてここに解決策があります。

Androidマニフェストファイルで設定した画面方向パラメータを変更する必要はありません。

2つのフォルダを追加するだけです

res>values
as  res>values-v26 
and res>values-v27

次に、styles.xmlおよびthemes.xmlファイルをそこにコピーします。

次のパラメータをTRUEからFALSEに変更します。

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

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

それが動作します。

Android 8.0の一般的なバグ


2

windowIsTranslucent 'true'を使用して方向を強制的に設定した場合、SDK 26(8.0.0)でのみこの問題に直面しました。

これが解決策です:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);   

        // fixing portrait mode problem for SDK 26 if using windowIsTranslucent = true
        if (Build.VERSION.SDK_INT == 26) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }        
    }



       <style name="SplashActivty" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
    </style>



<!-- Splash screen -->
        <activity
            android:name="edu.aku.family_hifazat.activities.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="unspecified"
            android:theme="@style/SplashActivty">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

ただし、実際に方向を希望どおりに設定する機能は失われます。
アンドロイド開発者

2

画像をキャプチャしようとするか、ギャラリーから画像を取得しようとすると、このエラーが発生しました

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

そして

android:screenOrientation="portrait"

今私の活動はこのテーマを使用しています:

  <style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

windowIsFloatingと同じクラッシュが発生するため、これは機能しませんwindowIsTranslucent
Android開発者、

2

8.0.0のみが例外をスローし、8.0を超えると例外が削除されます

8.0.0が例外をスローする



appInfo.targetSdkVersion > O例外をスローする
Mingo

targetSDKのバージョンをチェックしています。デバイスが実際に実行しているSDKのバージョンは関係ありません。AndroidO(28)に対してコンパイルしますが、そのバージョンのプラットフォームの規則に従っていません。
Benjiko99

2

私のために働いた唯一のことは変更でした

android:screenOrientation="portrait"

android:screenOrientation="unspecified"

すべての半透明のアクティビティのマニフェストで。

このように、半透明アクティビティはの時点で親アクティビティから向きを継承しているように見えるため、すべてのAPIバージョンと互換性がありますtargetApi: 28

そのままスタイルのままでOK <item name="android:windowIsTranslucent">true</item>です。


このソリューションを試みたが、アプリはまだクラッシュ
anber

しかし、その後、方向を設定する機能を失います
アンドロイド開発者

@androiddeveloper:私が理解する方法では、向きは親アクティビティから継承されます。この方法では機能しない半透明のアクティビティに別の方向を明示的に設定したい場合...
Max Heimer

前のアクティビティを制御できない場合があります。ユーザーが現在目にしているものの上に透明なものを表示したい場合があります。だからこれは役に立たない:(
android developer

2

使用する

android:screenOrientation="behind"

そしてテーマ

<style name="translucent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">#beaaaaaa</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
    <item name="android:typeface">normal</item>
    <item name="android:windowSoftInputMode">adjustPan</item>
    <item name="windowActionBar">false</item>
</style>

1

これがGoogleのバグなのか、意図された動作なのかはわかりませんが、GradleでcompileSdkVersionとtargetSdkVersionを26に戻すことで(少なくとも一時的に)解決しました...


3
targetsdkレベルを下げないでください。アプリは最終的にPlayストアからブロックされます。常に最新のAndroid API
Shmuel

1
@Shmuel:間違い。あなたは26をターゲットにすることができ、店の28で利用可能です。
Regis_AG

1
正解です。古いAPIレベルを対象にアプリをビルドすると、更新を余儀なくされたときに苦痛の世界に陥ることになります
Shmuel

これは解決策ではなく、回避策です。ある日、アプリを28に移行する必要があります。
sud007

1

問題を解決していない場合は、次のようにマニフェストに広告アクティビティを登録するだけです。

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

また、SDKを最新バージョンに更新する必要があります。


1

おそらく、Dialog(non- fullscreen)のように見えるアクティビティを表示しているので、manifestまたはコードからscreenOrientationを削除します。これで問題が解決します。


うーん、とても奇妙でした。私にとってはそうでした。さまざまなAndroidバージョンでアプリを実行してみてください。結果がどのように役立つかを確認してください...
Balflear

1

これは27日後に発生しました。targetSdkVersion26を使用して、Googleが修正するまで待ってください。


2
回答を投稿するときは、参照(リンクまたは引用)を提供してください。したがって、将来のユーザーは簡単に理解できます。また、SOコミュニティへようこそ。
Mohammedsalim Shivani

@MohammedsalimShivaniこちら:issuetracker.google.com/issues/68454482#comment4Googleのエンジニアリングチームがこの問題を修正しました。今後のAndroidリリースで利用可能になる予定です。リリースノートにご注意ください。」
アンドロイドデベロッパー

これは悪いアドバイスです
Chris

0

全画面以外の要素から「portrait」タグを削除したところ、すべてうまくいきました。

android:screenOrientation="portrait"

0

アクティビティのスタイルを確認し、半透明に関連するものを使用していないことを確認して、スタイルを代替に変更してください。この問題を修正できるようにします。

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

0

私はこの問題を解決android:screenOrientation="portrait"し、以下のコードをonCreateに追加して解決しました

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

私のテーマのプロパティは

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.