java.lang.IllegalStateException: เฉพาะกิจกรรมทึบแสงแบบเต็มหน้าจอเท่านั้นที่สามารถร้องขอการวางแนว


187

ฉันประสบปัญหาขณะเรียกข้อมูลผู้ติดต่อจากสมุดติดต่อใน Android 8.0 Oreo java.lang.IllegalStateException: เฉพาะกิจกรรมทึบแสงแบบเต็มหน้าจอเท่านั้นที่สามารถร้องขอการวางแนว

ฉันพยายามที่จะได้รับการติดต่อในกิจกรรมของฉันจากสมุดโทรศัพท์ติดต่อและมันทำงานได้อย่างสมบูรณ์แบบสำหรับ Lollipop, Marshmallow, Nougat, ฯลฯ แต่มันจะทำให้ฉันมีข้อผิดพลาดสำหรับ Oreo เช่นนี้ได้โปรดช่วยฉันด้วย รหัสของฉันอยู่ที่นี่ด้านล่าง

รหัสตัวอย่าง: -

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

ตรวจสอบสิ่งนี้: stackoverflow.com/questions/6745797/…
yash786

1
สิ่งนี้อาจช่วยคุณstackoverflow.com/questions/46980697/ …
Nilesh Rathod

ตรวจสอบสิ่งนี้เช่นกัน: stackoverflow.com/questions/46980697/…
yash786

1
ลองใช้คำแนะนำทั้งหมด แต่ไม่มีใครทำงานให้ฉัน
Shubham Sejpal

1
คุณใช้ Android: screenOrientation = "portrait" อย่างชัดแจ้งหรือไม่?
Ragesh Ramesh

คำตอบ:


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> ทำงานอาจขึ้นอยู่กับวิธีการที่คุณใช้งานได้ผลในกรณีของฉันมันทำงานโดยการตั้งค่าพวกเขาเป็นจริง


22
สำหรับทุกคนที่สะดุด "แก้ไข" นี้ฉันต้องตั้งค่า<item name="android:windowIsTranslucent">false</item>และต้องตั้งค่า<item name="android:windowIsFloating">false</item>ก่อนที่จะทำงาน
th317erd

8
คำตอบของเรื่องนี้อยู่ตรงไหน? ไม่มีscreenOrientationแอตทริบิวต์ในactivityแท็กและมีเพียงสิ่งเดียวที่ทำให้เกิดความผิดพลาดscreenOrientationขณะที่android:windowIsTranslucentตั้งค่าเป็นจริง
นักพัฒนา android

สิ่งนี้ไม่ทำงานยกเว้นว่ามีการใช้ความคิดเห็นด้านบน ดูคำตอบจาก Radesh ซึ่งครอบคลุมความคิดเห็นด้านบนและอื่น ๆ อีกมากมายและชัดเจน
Arberg

การตั้งค่าโปร่งแสงให้เป็นเท็จสำหรับฉัน <item name = "android: windowIsTranslucent"> false </item>
Tran Quan

ในกรณีของฉันการแก้ปัญหาคือการลบ 'android: theme' ออกจากกิจกรรมใน AndroidManifest.xml แต่ถ้าคุณต้องการคุณสามารถเพิ่มโปรแกรมได้ก่อน 'super.onCreate': setTheme (R.styleTheme_AppCompat_Light_Dialog);
Pavel Kataykin

133

ใน android Oreo (API 26) คุณไม่สามารถเปลี่ยนการวางแนวสำหรับกิจกรรมที่มีบรรทัดด้านล่างอย่างมีสไตล์

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

หรือ

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

คุณมีวิธีแก้ปัญหานี้หลายวิธี:

1)คุณสามารถลบบรรทัดด้านบน (หรือเปลี่ยนเป็นเท็จ ) และแอปของคุณทำงานได้ดี

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 ไม่ทำงานผมต้องทำใหม่styles.xmlในvalues-v26การปิดการใช้งานandroid:windowIsTranslucentสำหรับ API ว่ามีเพียง
AbdelHady

@AbdelHady ทางออกที่ดีฉันจะเพิ่มไปยังคำตอบของฉัน แต่ตรวจสอบรหัสของคุณและทำไมตัวเลือกที่ 2 ไม่ทำงานตัวเลือกที่ฉันแนะนำ
#:

1
ฉันใช้ตัวเลือก 3 กับค่าบูลีน<bool name="allowWindowFullScreenTranslucent">true</bool>และอ้างอิงกับสิ่งต่อไป<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>นี้ จากนั้นใน styles.xml ภายใต้ค่า-V26 ตั้งค่าให้falseและค่านิยมและค่า-V27 trueชุดมัน
drorsun

87

ใน Android O และใหม่กว่าข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณตั้งค่า

 android:screenOrientation="portrait"

ใน Manifest

ลบบรรทัดนั้นและใช้

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ในกิจกรรมของคุณ

สิ่งนี้จะแก้ไขปัญหาของคุณ


7
มันเป็นบั๊กจากฝั่ง google ควรได้รับการแก้ไขในการปรับปรุงในอนาคต setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); จะ จำกัด แอปของคุณไม่ให้อยู่ในแนวนอน ตรวจสอบให้แน่ใจว่าคุณใช้สิ่งนี้ในการสร้างกิจกรรมทั้งหมดของคุณ
Ragesh Ramesh

44
การลบออก <item name="android:windowIsTranslucent">true</item>จากสไตล์ของฉันที่สืบทอดมาจากการTheme.AppCompat.Light.NoActionBar ทำงานเพื่อฉัน
shadowsheep

16
วิธีนี้ใช้งานได้ แต่มันทำให้หน้าจอของฉันสกปรก อัปยศใน Google สำหรับโรล
เลอ

3
"ตั้งใจ" จะทำลายแอปที่ใช้กับเวอร์ชันก่อนหน้าหรือไม่ เป้าหมายนั้นสำเร็จลุล่วงอย่างแน่นอน อย่างน้อยเราก็มีทางออกด้วย @Ragesh
Oleg Gryb

9
การแทนที่แอททริบิวต์ Manifest ด้วยการตั้งค่าการวางแนวในคลาสกิจกรรมไม่สามารถแก้ปัญหาได้
rmgoncalo

75

Google โยนข้อยกเว้นนี้ในonCreateวิธีการของกิจกรรมหลังจาก v27 ความหมายของมันคือ: ถ้ากิจกรรมโปร่งแสงหรือลอยตัวการวางแนวของกิจกรรมนั้นควรอาศัยผู้ปกครอง (พื้นหลัง) กิจกรรมไม่สามารถตัดสินใจด้วยตัวเองได้

แม้ว่าคุณจะลบออกandroid:screenOrientation="portrait"จากกิจกรรมลอยตัวหรือโปร่งแสง แต่แก้ไขการวางแนวบนกิจกรรมหลัก (พื้นหลัง) มันยังคงได้รับการแก้ไขโดยผู้ปกครองฉันได้ทดสอบแล้ว

สถานการณ์พิเศษหนึ่งอย่าง: ถ้าคุณทำให้โปร่งแสงบนกิจกรรมของตัวเรียกใช้มันจะไม่เป็นแม่ (พื้นหลัง) ดังนั้นให้หมุนด้วยอุปกรณ์ ต้องการแก้ไขคุณต้องใช้วิธีอื่นเพื่อแทนที่<item name="android:windowIsTranslucent">true</item>สไตล์


2
ฉันไม่มีปัญหานี้ใน OnePlus ที่ใช้ Android PIE ดังนั้นมันจึงไม่ใช่ v27 แต่เมื่อ v! = 28
Entreco

คุณมีลิงค์ไปยังเอกสารประกอบสำหรับสิ่งนี้หรือไม่? ฉันหามันไม่เจอ
Shivam Verma

ปัญหาโปร่งแสงบ้าจริง ๆ ขอบคุณมันช่วยแก้ปัญหาของฉัน
Abhishek Garg

ขอบคุณสำหรับการสังเกตว่าในส่วนสุดท้าย 'สถานการณ์พิเศษหนึ่งอย่าง ... '
guy_m

นี่ควรเป็นคำตอบที่ยอมรับได้ ทำให้รู้สึกที่สมบูรณ์แบบ!
stoefln

29

หากคุณใช้กิจกรรมที่โปร่งใสแบบเต็มหน้าจอคุณไม่จำเป็นต้องระบุล็อกการวางแนวของกิจกรรม จะใช้การตั้งค่าการกำหนดค่าของกิจกรรมหลัก ดังนั้นหากกิจกรรมหลักมีอยู่ในรายการ:

หุ่นยนต์: screenOrientation = "ภาพ"

กิจกรรมโปร่งแสงของคุณจะมีการวางแนวเดียวกัน: แนวตั้ง


ฉันคิดว่าคุณพิมพ์ผิดเล็กน้อย: ควรเป็น "ถ้าคุณใช้กิจกรรมโปร่งแสงแบบเต็มหน้าจอมันจะใช้การตั้งค่าการกำหนดค่ากิจกรรมหลัก" ^^
Josselin

2
จะทำอย่างไรถ้ากิจกรรมที่โปร่งใสของฉันคือกิจกรรมตัวเรียกใช้ของฉัน (เช่นหน้าจอเริ่มต้น)
Bhupesh

2
สิ่งนี้เป็นจริงสำหรับ Android ทุกรุ่นหรือไม่ หรือเป็นเฉพาะ Android O ขึ้นไป?
abhiank

สิ่งนี้จะไม่ทำงานหากนี่เป็นกิจกรรมเดียวที่ใช้งานอยู่ (ตัวอย่าง: เริ่มต้นจากบริการ)
นักพัฒนา Android

24

ผมใช้แทนandroid:screenOrientation="behind" android:screenOrientation="portrait"โดยทั่วไปคุณสร้างไดอะล็อก (ในกิจกรรม) และไดอะล็อกไม่สามารถร้องขอการวางแนวด้วยตัวเองโดยต้องการกิจกรรมพาเรนต์เพื่อทำสิ่งนี้ (เนื่องจากพาเรนต์ปรากฏในพื้นหลังและมีเลย์เอาต์ของตัวเอง)

"เบื้องหลัง" การวางแนวเดียวกับกิจกรรมที่อยู่ด้านล่างทันทีในสแต็กกิจกรรม


จะเกิดอะไรขึ้นถ้าฉันต้องการให้กิจกรรมที่ฉันสร้างขึ้นมีความโปร่งใสแสดงสิ่งที่อยู่ข้างใต้ (รวมถึงแอพอื่น ๆ ) ในขณะที่ยังคงอยู่ในทิศทางปัจจุบัน ถ้าฉันปล่อยให้มันอยู่ข้างหลังมันก็ยังสามารถเปลี่ยนทิศทางในกรณีต่าง ๆ ...
นักพัฒนา Android

19

ทางออกเดียวที่ใช้งานได้จริง:

เปลี่ยนแปลง:

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

ถึง:

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

ใน styles.xml

แต่สิ่งนี้อาจทำให้เกิดปัญหากับ splashscreen ของคุณ (หน้าจอสีขาวเมื่อเริ่มต้น) ... ในกรณีนี้ให้เพิ่มบรรทัดต่อไปนี้ใน styles.xml ของคุณ:

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

ด้านล่างของหน้าต่างเป็นเส้นโปร่งแสง

โอกาสสุดท้ายหากเคล็ดลับก่อนหน้านี้ไม่ทำงาน: เป้าหมาย SDK 26 แทน o 27


1
เปลี่ยน SDK เป้าหมายเป็น 26 แทนที่จะเป็น 27 สำหรับฉัน การเปลี่ยนหน้าต่าง IsTranslucent ไม่ได้
Cliche818

สิ่งนี้ใช้ได้กับฉันโดยใช้ targetSDK: 27 มันสำคัญเป็นพิเศษเนื่องจากฉันได้กำหนดค่าสแปลช
Leonardo G.

18

ถ้าคุณต้องใช้ setRequestedOrientation()ไม่มีวิธีใดนอกจากเสียสละคุณลักษณะของหน้าต่าง IsTranslucent ใน Android 8.0

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
การตรวจสอบรหัสบนต้นแบบในตอนนี้มันถูกลบออกจากเฟรมเวิร์ก: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e9672 # diff-a9aa0352703240c8ae70f1c83add4bc8 มันน่าสนใจที่จะเห็นข้อความ
Erick M. Sprengel

คุณช่วยแสดงลิงค์ไปยังซอร์สโค้ดของส่วนนี้ได้ไหม มีวิธีแก้ปัญหาใดบ้างที่จะทำให้ฉันมีกิจกรรมที่มีการวางแนวเฉพาะและมีพื้นหลังที่โปร่งใสเพื่อให้สามารถมองเห็นสิ่งที่อยู่ข้างหลัง (รวมถึงแอพอื่น ๆ )
นักพัฒนา 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 ฉันยังสามารถออกจากหน้าจอการเข้าร่วมในรายการ
แฟรงก์

1
สิ่งนี้ไม่ทำงานเหมือนกับหน้าต่าง IsTranslucent เพราะตอนนี้คุณไม่สามารถเห็นสิ่งที่อยู่เบื้องหลังกิจกรรม
นักพัฒนา android

8

เพียงลบบรรทัดandroid:screenOrientation="portrait"ของกิจกรรมนี้ใน Manifiest.xml

<item name="android:windowIsTranslucent">true</item>กิจกรรมที่จะได้รับการปฐมนิเทศจากกิจกรรมก่อนหน้านี้มันจึงไม่จำเป็นต้องใช้การวางแนวทางที่มี


จะทำอย่างไรถ้ากิจกรรมก่อนหน้ามีการวางแนวที่แตกต่างกันสิ่งที่คุณต้องการในกิจกรรมปัจจุบัน
ClassA

6

ดูเหมือนว่าเมื่อเป้าหมาย sdk คือพาย (ระดับ api 28.0) และ windowIsTranslucent เป็นจริง

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

และคุณพยายามเข้าถึงการปฐมนิเทศ ปัญหามาพร้อมกับ Android oreo 8.0 (api ระดับ 26) มีสองวิธีในการแก้ปัญหานี้

  1. ลบการวางแนว
  2. หรือตั้งค่าหน้าต่างเป็นโปร่งแสงเป็นเท็จ

หากคุณตั้งค่าการวางแนวอย่างชัดแจ้งเช่นนี้

android:screenOrientation="portrait"

หรือในชั้นเรียนกิจกรรมเช่นนี้

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ลบแบบฟอร์มทั้งสองแห่ง

และสังเกตเมื่อคุณตั้งค่าหน้าต่าง isTranslucent เป็นจริงจะใช้การวางแนวจากกิจกรรมหลัก


5

ในไฟล์รายการตั้งค่ากิจกรรมที่สอง 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" />

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
กรุณาใช้ภาษาอังกฤษในกองล้น ขอบคุณ!
Michael Myers

3

หลังจากทำการวิจัยบางอย่างดูเหมือนว่าปัญหานี้อาจเกิดจากข้อบกพร่องของ Google สำหรับฉันฉันสามารถออกจากบรรทัดนี้ในกิจกรรมของฉันบนวิธีสร้าง:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

และฉันเปลี่ยน targetSdkVersion เป็น 26. การมีบรรทัดนั้นใน onCreate ของฉันยังคงส่งผลให้เกิดความผิดพลาดในขณะที่ targetSdkVersion ของฉันยังคงตั้งค่าไว้ที่ 27 เนื่องจากวิธีการแก้ปัญหาของคนอื่นไม่ทำงานสำหรับฉันจนถึงตอนนี้ฉันพบว่า ตอนนี้


1
อันนี้ใช้งานได้สำหรับฉันโดยตั้ง targetSdkVersion เป็น 26, android: screenOrientation = "portrait" และ <item name = "android: windowIsTranslucent"> true </item>
siripan

@siripan สำหรับฉันด้วย
Acauã Pitta

แต่ในที่สุดคุณจะต้องตั้ง targetSdkVersion ที่จะ 28 ปีนี้: support.google.com/googleplay/android-developer/answer/... คุณจะทำอะไร?
นักพัฒนา android

3

มันเป็นความขัดแย้ง (ข้อผิดพลาด) ระหว่างธีมภายในไฟล์ style.xml ใน Android เวอร์ชัน 7 (ระดับ Api 24,25) และ 8 (ระดับ API 26,27) เมื่อคุณมี

android:screenOrientation="portrait" : ภายในกิจกรรมเฉพาะ (ที่เกิดปัญหา) ใน AndroidManifest.xml

&

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

ในธีมที่ใช้กับกิจกรรมนั้นใน style.xml

สามารถแก้ไขได้ด้วยวิธีเหล่านี้ตามความต้องการของคุณ:

1- ลบออกจากคุณสมบัติที่กล่าวถึงข้างต้นซึ่งทำให้เกิดความขัดแย้ง

2- เปลี่ยนการวางแนวกิจกรรมเป็นหนึ่งในค่าเหล่านี้ตามที่คุณต้องการ: unspecifiedหรือbehindอื่น ๆ ที่สามารถพบได้ที่นี่: การอ้างอิงของ Google สำหรับ Android: screenOrientation `

3- ตั้งค่าการวางแนวโปรแกรมในเวลาทำงาน


พยายามแก้ปัญหานี้ แต่แอพยังคงขัดข้อง: ฉันต้องการกิจกรรมแนวโปร่งใสเพื่อให้ฉันต้องการตัวเลือกทั้งสองนี้ พยายามตั้งค่าในหน้าจอรายการการอ้างอิงไม่ระบุ แต่ไม่มีโชค
anber

ไม่ฉันลองลบการวางแนวอย่างชัดแจ้งเลยและทำกิจกรรมเต็มหน้าจอ แต่ก็ยังขัดข้อง เฉพาะ 1 อุปกรณ์ - ให้เกียรติ 9 lite สำหรับ Samsung มันใช้งานได้ดี
anber

การตั้งค่าการวางแนวโดยโปรแกรมยังทำให้เกิดความผิดพลาด คุณใช้มันอย่างไร
นักพัฒนา android

@androiddeveloper ฉันจะเข้าถึงซอร์สโค้ดของคุณได้อย่างไร! ฉันต้องดูสิ่งที่คุณทำ
Hamed Jaliliani

@HamedJaliliani การตั้งค่า programmaticaly เป็นเช่นนี้ตัวอย่าง: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
นักพัฒนา Android

3

ฉันเพิ่งเผชิญกับปัญหาและนี่คือทางออก

ไม่จำเป็นต้องเปลี่ยนพารามิเตอร์การวางแนวหน้าจอที่คุณตั้งไว้ที่ไฟล์รายการหุ่นยนต์

เพียงเพิ่มสองโฟลเดอร์

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

ฉันประสบปัญหานี้เฉพาะใน SDK 26 (8.0.0) หากใช้ windowIsTranslucent 'true' และตั้งค่าการวางแนว:

นี่คือทางออก:

    @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>

แต่คุณจะสูญเสียการทำงานของการวางแนวตั้งตามที่คุณต้องการ
นักพัฒนา android

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 โยนข้อยกเว้น


Android 7, 7.1, 8.0, 8.1 ทุกคนมีปัญหานี้
Hamed Jaliliani

appInfo.targetSdkVersion > Oโยนข้อยกเว้น
Mingo

มันตรวจสอบtargetเวอร์ชั่นของ sdk ไม่สำคัญว่าอุปกรณ์ sdk รุ่นใดกำลังใช้งานจริงคุณกำลังรวบรวมกับ Android O (28) แต่ไม่ทำตามอนุสัญญาของแพลตฟอร์มเวอร์ชันนั้น
Benjiko99

2

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือการเปลี่ยนแปลง

android:screenOrientation="portrait"

ถึง

android:screenOrientation="unspecified"

ในรายการสำหรับกิจกรรมโปร่งแสงทั้งหมด

ด้วยวิธีนี้มันเข้ากันได้กับทุกเวอร์ชัน API เนื่องจากกิจกรรมโปร่งแสงดูเหมือนว่าจะสืบทอดการปฐมนิเทศจากกิจกรรมหลักในขณะtargetApi: 28นั้น

สามารถวางสไตล์ตามที่รวม<item name="android:windowIsTranslucent">true</item>ไว้


พยายามแก้ปัญหานี้ แต่ app ยังคงเกิดปัญหา
anber

แต่คุณสูญเสียหน้าที่การตั้งค่าการวางแนว
นักพัฒนาระบบ Android

@androiddeveloper: วิธีที่ฉันเข้าใจการปฐมนิเทศจะสืบทอดมาจากกิจกรรมของผู้ปกครอง หากคุณต้องการกำหนดทิศทางอื่นในกิจกรรมโปร่งแสงที่ไม่สามารถใช้วิธีนี้ได้อย่างชัดเจน ...
Max Heimer

บางครั้งคุณไม่สามารถควบคุมกิจกรรมก่อนหน้าได้ บางครั้งคุณต้องการที่จะแสดงความโปร่งใสของคุณด้านบนของสิ่งที่ผู้ใช้เห็นในปัจจุบัน ดังนั้นสิ่งนี้จึงไม่สามารถช่วยได้ :(
พัฒนา android

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 หรือพฤติกรรมที่ตั้งใจ แต่ฉัน (อย่างน้อยก็ชั่วครู่) แก้ไขได้โดยเปลี่ยน compileSdkVersion และ targetSdkVersion กลับเป็น 26 ใน Gradle ...


3
คุณไม่ควรลดระดับ targetdk แอปของคุณจะถูกบล็อกจาก play store ในที่สุด กำหนดเป้าหมายระดับ Android Api ล่าสุดเสมอandroid-developers.googleblog.com/2017/12/…
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 (ไม่ใช่แบบเต็มหน้าจอ) ดังนั้นให้ลบscreenOrientationจากManifestหรือจากรหัส สิ่งนี้จะแก้ไขปัญหา


อืมแปลกมากสำหรับฉันในกรณีนี้ ลองใช้งานแอพพลิเคชั่นบน Android เวอร์ชั่นต่าง ๆ ดูว่าอะไรจะเกิดขึ้นกับคุณซึ่งจะช่วยคุณได้ ...
Balflear

1

สิ่งนี้เกิดขึ้นหลังจาก 27 ให้ใช้ targetSdkVersion 26 แทนที่รอ google แก้ไข


2
โปรดให้การอ้างอิงใด ๆ (ลิงค์หรือที่ยกมา) เมื่อโพสต์คำตอบ ดังนั้นผู้ใช้ในอนาคตสามารถเข้าใจได้ง่าย นอกจากนี้ยังยินดีต้อนรับสู่ชุมชน SO
Mohammedsalim Shivani

@MohammedsalimShivani ที่นี่: issuetracker.google.com/issues/68454482#comment4 "ทีมวิศวกรของเราได้แก้ไขปัญหานี้แล้วจะมีวางจำหน่ายในรุ่น Android ในอนาคตดังนั้นโปรดคอยดูบันทึกย่อประจำรุ่น"
นักพัฒนา android

นี่เป็นคำแนะนำที่ไม่ดี
Chris


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.