java.lang.IllegalStateException: Chỉ các hoạt động mờ toàn màn hình mới có thể yêu cầu định hướng


187

Tôi đang gặp vấn đề trong khi truy xuất danh bạ từ sổ liên lạc trong Android 8.0 Oreo java.lang.IllegalStateException: Chỉ các hoạt động mờ toàn màn hình mới có thể yêu cầu định hướng

Tôi đang cố gắng để có được liên lạc trong hoạt động của mình từ sổ liên lạc điện thoại và nó hoạt động hoàn hảo cho Lollipop, Marshmallow, Nougat, v.v. nhưng nó sẽ gây ra lỗi cho Oreo như thế này xin hãy giúp tôi. Mã của tôi ở đây dưới đây.

Mã giới thiệu: -

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");
        }
}

Nhật ký lỗi: -

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

Kiểm tra điều này: stackoverflow.com/questions/6745797/
Khắc

1
điều này có thể giúp bạn stackoverflow.com/questions/46980697/ từ
Nilesh Rathod

cũng kiểm tra điều này: stackoverflow.com/questions/46980697/ từ
yash786

1
Đã thử tất cả các đề nghị nhưng không ai làm việc cho tôi.
Shubham Sejpal

1
bạn có đang sử dụng android: screenOrientation = "Portrait" trong tệp kê khai không?
Ragesh Ramesh

Câu trả lời:


62

Vấn đề dường như đang xảy ra khi sdk mục tiêu của bạn là 28. Vì vậy, sau khi thử nhiều lựa chọn, cuối cùng nó cũng hoạt động.

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

Phong cách:-

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

Lưu ý: Parent = "Theme.AppCompat.Light.NoActionBar" là cần thiết cho api 28. Trước đây có một cái gì đó khác ở api 26. Đã hoạt động rất tốt nhưng bắt đầu đưa ra vấn đề ở 28. Hy vọng nó sẽ giúp được ai đó ở đây. EDIT: Đối với một số chỉ bằng cách thiết lập làm việc. <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> Có thể phụ thuộc vào cách bạn triển khai giải pháp hoạt động. Trong trường hợp của tôi, nó hoạt động bằng cách đặt chúng thành đúng.


22
Đối với bất kỳ ai khác vấp phải "sửa chữa" này, tôi phải đặt <item name="android:windowIsTranslucent">false</item>và cũng phải đặt <item name="android:windowIsFloating">false</item>trước khi nó hoạt động.
th317erd

8
Chính xác thì đâu là giải pháp cho vấn đề này? Không có screenOrientationthuộc tính trong activitythẻ và điều duy nhất gây ra sự cố đang screenOrientationđược đặt trong khi android:windowIsTranslucentđược đặt thành đúng.
nhà phát triển Android

Điều này không hoạt động, trừ khi ý kiến ​​trên được sử dụng. Xem câu trả lời của Radesh, bao gồm các ý kiến ​​ở trên, và nhiều hơn nữa, và rõ ràng
arberg

Đặt mờ thành công việc sai cho tôi <item name = "android: windowIsTranslucent"> false </ item>
Tran Quan

Trong trường hợp của tôi, giải pháp là xóa 'android: theme' khỏi Activity trong AndroidManifest.xml. Nhưng nếu bạn cần nó, bạn có thể thêm nó theo chương trình trước 'super.onCreate': setTheme (R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin

131

Trong Android Oreo (API 26), bạn không thể thay đổi hướng cho Hoạt động có kiểu bên dưới dòng

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

hoặc là

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

Bạn có một số cách để giải quyết điều này:

1) Bạn có thể chỉ cần xóa (các) dòng trên (hoặc biến nó thành false ) và ứng dụng của bạn hoạt động tốt.

2) Hoặc trước tiên bạn có thể xóa dòng dưới đây khỏi bảng kê khai cho hoạt động đó

android:screenOrientation="portrait"

Sau đó, bạn phải thêm dòng này vào hoạt động của mình (trong onCreate ())

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

3) Bạn có thể tạo mới styles.xmltrong values-v26thư mục và thêm cái này vào style.xml. (Cảm ơn bình luận của AbdelHady )

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

25
trên Android PIE, nó hoạt động như mong đợi. Vì vậy, kiểm tra thực sự nên là:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco

@avisper bạn có thể vui lòng chia sẻ mã điều kiện đầy đủ
Manikandan K

Trong một thiết bị / giả lập chạy API 26, phương án 2 không làm việc, tôi đã phải làm một mới styles.xmltrong values-v26để vô hiệu hóa android:windowIsTranslucentcho chỉ API mà.
AbdelHady

@AbdelHady Giải pháp tốt, tôi sẽ thêm nó vào câu trả lời của mình nhưng kiểm tra mã của bạn và tốt tại sao tùy chọn 2 không hoạt động, đó là tùy chọn được đề xuất của tôi,
Radesh

1
Tôi đã sử dụng tùy chọn 3 với giá trị boolean <bool name="allowWindowFullScreenTranslucent">true</bool>và tham chiếu đến nó <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Sau đó, trong tệp kiểu tệp theo giá trị-v26, đặt nó thành falsevà trong các giá trị và giá trị-v27 đặt nó thành true.
drorsun

86

Trong Android O và sau đó, lỗi này xảy ra khi bạn đặt

 android:screenOrientation="portrait"

trong Bản kê khai.

Xóa dòng đó và sử dụng

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

trong hoạt động của bạn.

Điều này sẽ khắc phục vấn đề của bạn.


7
Đó là một lỗi từ phía google. Nên được sửa trong các bản cập nhật trong tương lai. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); sẽ hạn chế ứng dụng của bạn đi vào cảnh quan. Hãy chắc chắn rằng bạn sử dụng điều này trong việc tạo ra tất cả các hoạt động của bạn.
Ragesh Ramesh

44
Loại bỏ <item name="android:windowIsTranslucent">true</item> khỏi phong cách của tôi mà kế thừa từ Theme.AppCompat.Light.NoActionBar làm việc cho tôi.
Shadowheep

16
Giải pháp này hoạt động, nhưng nó làm rối tung SplashScreenTheme của tôi. Xấu hổ trên Google vì thường xuyên cẩu thả ...
Doctorram

3
"Dự định" để phá vỡ các ứng dụng hoạt động trên các phiên bản trước? Mục tiêu đó đã được thực hiện chắc chắn. Ít nhất chúng ta có một giải pháp, nhờ @Ragesh
Oleg Gryb 18/03/18

9
Thay thế thuộc tính tệp kê khai bằng cách đặt hướng trên lớp Activity không giải quyết được vấn đề.
rmgoncalo

75

Google ném ngoại lệ này vào Activity's onCreate phương thức sau v27, ý nghĩa của chúng là: nếu một Hoạt động mờ hoặc nổi, hướng của nó phải dựa vào Hoạt động của cha mẹ (nền), không thể tự đưa ra quyết định.

Ngay cả khi bạn loại bỏ android:screenOrientation="portrait" khỏi Hoạt động nổi hoặc mờ nhưng sửa hướng trên Hoạt động gốc (nền) của nó, nó vẫn được cố định bởi cha mẹ, tôi đã kiểm tra rồi.

Một tình huống đặc biệt: nếu bạn thực hiện mờ trong Hoạt động của trình khởi chạy, nó không có cha mẹ (nền), vì vậy luôn luôn xoay với thiết bị. Muốn sửa nó, bạn phải dùng cách khác để thay thế <item name="android:windowIsTranslucent">true</item>phong cách.


2
Tôi không gặp vấn đề này trên OnePlus của tôi chạy Android PIE. Vì vậy, không phải sau v27, mà là khi v! = 28
Entreco

Bạn có tình cờ có một liên kết đến các tài liệu cho việc này? Tôi dường như không thể tìm thấy nó.
Shivam Verma

vấn đề mờ thực sự điên rồ, cảm ơn, nó đã khắc phục vấn đề của tôi
Abhishek Garg

Cảm ơn bạn đã lưu ý rằng phần cuối cùng 'Một tình huống đặc biệt ...'
chàng_m

Đây phải là câu trả lời được chấp nhận. Làm cho cảm giác hoàn hảo!
stoefln

28

Nếu bạn sử dụng hoạt động trong suốt toàn màn hình, không cần chỉ định khóa định hướng trên hoạt động. Nó sẽ có các cài đặt cấu hình của hoạt động cha. Vì vậy, nếu hoạt động cha mẹ có trong bảng kê khai:

android: screenOrientation = "chân dung"

hoạt động mờ của bạn sẽ có cùng một khóa định hướng: dọc.


Tôi nghĩ rằng bạn đã mắc một lỗi đánh máy nhỏ: nên là "nếu bạn sử dụng hoạt động mờ toàn màn hình, nó sẽ lấy cài đặt cấu hình của hoạt động chính của nó" ^^
Josselin

2
Điều gì xảy ra nếu hoạt động minh bạch của tôi là hoạt động trình khởi chạy của tôi (tức là màn hình giật gân)
Bhupesh

2
Điều này có đúng với tất cả các phiên bản Android không? Hay chỉ có Android O trở lên?
abhiank

Điều này sẽ không hoạt động nếu đây là Hoạt động duy nhất đang được sử dụng, tuy nhiên (ví dụ: bắt đầu từ Dịch vụ)
nhà phát triển Android

24

Tôi đã sử dụng android:screenOrientation="behind"thay vì android:screenOrientation="portrait". Về cơ bản, bạn đã tạo một hộp thoại (trong một hoạt động) và chính hộp thoại không thể yêu cầu định hướng, nó cần hoạt động chính để thực hiện điều này (vì cha mẹ có thể nhìn thấy trong nền và có bố cục riêng).

"Đằng sau" Định hướng tương tự như hoạt động ngay bên dưới nó trong ngăn xếp hoạt động.


Điều gì sẽ xảy ra nếu tôi muốn Hoạt động mà tôi đã tạo được minh bạch, hiển thị những gì bên dưới nó (bao gồm các ứng dụng khác), trong khi vẫn theo định hướng hiện tại? Nếu tôi để nó ở lại "phía sau", nó vẫn có thể thay đổi hướng trong nhiều trường hợp khác nhau ...
nhà phát triển Android

19

Giải pháp duy nhất thực sự hiệu quả:

Thay đổi:

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

đến:

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

trong tệp XML

Nhưng điều này có thể gây ra sự cố với màn hình giật gân của bạn (màn hình trắng khi khởi động) ... Trong trường hợp này, hãy thêm dòng sau vào tệp style.xml của bạn:

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

ngay bên dưới dòng windowIsTranslucent.

Cơ hội cuối cùng nếu các mẹo trước không hoạt động: nhắm mục tiêu SDK 26 thay vì 27.


1
Thay đổi SDK mục tiêu thành 26 thay vì 27 làm việc cho tôi. Thay đổi windowIsTranslucent đã không.
Cliche818

Điều này làm việc với tôi bằng cách sử dụng targetSDK: 27. Điều này đặc biệt quan trọng vì tôi đã cấu hình màn hình giật gân.
Leonardo G.

18

Nếu bạn phải sử dụng setRequestedOrientation(), không có cách nào khác ngoài việc hy sinh thuộc tính windowIsTranslucent trên Android 8.0

values\styles.xml cho cấp độ 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 cho api cấp 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 cho cấp độ api 27+ (> 8.0)

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

14

Nhiều người đã đưa ra cách khắc phục, vì vậy tôi sẽ nói về nguồn gốc của vấn đề.

Theo log ngoại lệ

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)

Mã đã kích hoạt ngoại lệ trong 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;
        }

Theo phân tích mã ở trên, khi TargetSdkVersion> = 27, khi sử dụng SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT và các thuộc tính liên quan khác, việc sử dụng các thuộc tính windowIsTranslucent, windowIsFloating và windowSwipe

Sau khi tìm thấy sự cố, bạn có thể thay đổi TargetSdkVersion hoặc xóa các thuộc tính liên quan của chủ đề theo nhu cầu của bạn.


1
Kiểm tra mã trên master tại thời điểm này, nó đã bị xóa khỏi framework: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83
Erick M. Sprengel

Bạn có thể vui lòng hiển thị một liên kết đến mã nguồn của phần này? Có cách giải quyết nào cho phép tôi có một Hoạt động với định hướng cụ thể VÀ có nền trong suốt, để có thể thấy những gì đằng sau nó (bao gồm các ứng dụng khác) không?
nhà phát triển Android

8

Tôi không thể đồng ý với câu trả lời được đánh giá cao nhất, bởi vì

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

gây ra lỗi

java.lang.IllegalStateException: Chỉ các hoạt động mờ toàn màn hình mới có thể yêu cầu định hướng

nhưng điều này làm cho nó hoạt động với tôi

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

và sử dụng nó cho Hoạt động của bạn, khi bạn kéo dài từ

InterstitialActivity extends AppCompatActivity

trong 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> => điều này đã sửa nó cho tôi trên Android 8.0. Tôi vẫn có thể rời khỏi màn hình trong bảng kê khai.
Frank

1
Điều này không hoạt động giống như windowIsTranslucent, vì bây giờ bạn không thể thấy những gì đằng sau Hoạt động.
nhà phát triển Android

8

Chỉ cần loại bỏ dòng này android:screenOrientation="portrait" hoạt động này trong Manifiest.xml

Hoạt động đó sẽ có được định hướng từ hoạt động trước đó vì vậy không cần phải áp dụng định hướng có <item name="android:windowIsTranslucent">true</item>.


Điều gì xảy ra nếu hoạt động trước đó có định hướng khác với những gì bạn muốn trong hoạt động hiện tại?
ClassA

6

có vẻ như khi sdk mục tiêu là pie (api level 28.0) và windowIsTranslucent là đúng

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

và bạn cố gắng truy cập định hướng. vấn đề đi kèm với Android oreo 8.0 (api cấp 26) có hai cách để giải quyết vấn đề này

  1. loại bỏ định hướng
  2. hoặc đặt windowIsTranslucent thành false

nếu bạn đang thiết lập định hướng trong bảng kê khai như thế này

android:screenOrientation="portrait"

hoặc trong lớp hoạt động như thế này

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

loại bỏ hình thức cả hai nơi.

và quan sát thấy khi bạn đặt windowIsTranslucent thành true, nó sẽ lấy định hướng từ hoạt động cha.


5

trong tệp kê khai đặt hoạt động thứ hai ParentActivityName làm hoạt động đầu tiên và xóa tham số screenOrientation sang hoạt động thứ hai. nó có nghĩa là hoạt động đầu tiên của bạn là cha mẹ và quyết định định hướng cho hoạt động thứ hai của bạn.

<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

Chỉ cần đặt Định hướng hoạt động trong Manifiest.xml

android:screenOrientation="unspecified"

HOẶC bị giới hạn trong Định hướng chân dung

Bạn cũng có thể sử dụng trong Activity, In onCreatephương thức gọi trước, super.onCreate(...)vd

@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

Tôi đã có cùng một vấn đề, và giải pháp của tôi là loại bỏ dòng

android:screenOrientation="portrait"

và sau đó thêm điều này trong hoạt động:

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

1
Vui lòng sử dụng tiếng Anh trên Stack Overflow. Cảm ơn!
Michael Myers

3

Sau khi thực hiện một số nghiên cứu, có vẻ như vấn đề này có thể là do lỗi của google. Đối với tôi, tôi đã có thể rời khỏi dòng này trong phương thức Activity onCreate của mình:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

VÀ tôi đã thay đổi targetSdkVersion của mình thành 26. Có dòng đó trong onCreate của tôi vẫn dẫn đến sự cố trong khi targetSdkVersion của tôi vẫn được đặt ở mức 27. Cho đến nay, không có giải pháp nào khác hoạt động cho tôi. hiện nay.


1
Cái này hoạt động với tôi bằng cách đặt targetSdkVersion thành 26, android: screenOrientation = "Portrait" và <item name = "android: windowIsTranslucent"> true </ item>
siripan 19/11/18

@siripan cũng cho tôi
Acauã Pitta

Nhưng cuối cùng, bạn sẽ phải đặt targetSdkVersion thành 28 trong năm nay: support.google.com.vn/googleplay/android-developerpcs/ ,. Bạn sẽ làm gì?
nhà phát triển Android

3

Đó là xung đột (lỗi) giữa Chủ đề bên trong tệp style.xml trong phiên bản Android 7 (cấp độ Api 24,25) & 8 (cấp độ api 26,27), khi bạn có

android:screenOrientation="portrait" : bên trong hoạt động cụ thể (sự cố) trong AndroidManifest.xml

&

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

trong chủ đề được áp dụng cho hoạt động đó bên trong style.xml

Nó có thể được giải quyết bằng những cách này theo nhu cầu của bạn:

1- Loại bỏ các thuộc tính được đề cập ở trên gây xung đột

2- Thay đổi hướng Hoạt động thành một trong những giá trị này khi bạn cần: unspecifiedhoặc behindv.v. có thể tìm thấy ở đây: Tham chiếu Google cho android: screenOrientation `

3- Đặt hướng lập trình theo thời gian chạy


Đã thử giải pháp này, nhưng ứng dụng vẫn gặp sự cố: Tôi cần hoạt động trong suốt chân dung nên tôi cần cả hai tùy chọn này. Đã thử thiết lập trong màn hình hiển thị Không xác định, nhưng không có may mắn.
anber

Không. Tôi đã cố gắng loại bỏ định hướng trong bảng kê khai và tạo toàn màn hình hoạt động, nhưng nó vẫn gặp sự cố. Chỉ trên 1 thiết bị - vinh dự 9 lite. Trên Samsung nó hoạt động tốt.
anber

Đặt hướng theo chương trình cũng gây ra sự cố. Làm thế nào bạn sử dụng nó chính xác?
nhà phát triển Android

@androiddeveloper làm thế nào tôi có thể truy cập mã nguồn của bạn?! Tôi phải xem những gì bạn đã làm
Hamed Jaliliani

@HamedJaliliani Đặt chương trình theo chương trình là như vậy, ví dụ: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
nhà phát triển Android

3

Gần đây tôi đã phải đối mặt với vấn đề và đây là giải pháp.

Không cần thay đổi tham số hướng màn hình mà bạn đặt ở tệp kê khai Android.

Chỉ cần thêm hai thư mục trong

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

Sau đó, sao chép tập tin style.xml và Themes.xml của bạn ở đó.

và thay đổi các tham số sau từ TRUE thành FALSE.

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

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

Nó sẽ làm việc.

Một lỗi phổ biến của Android 8.0


2

Tôi chỉ gặp phải vấn đề này trong SDK 26 (8.0.0) nếu sử dụng windowIsTranslucent 'true' và thiết lập định hướng mạnh mẽ:

Đây là giải pháp:

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

Nhưng sau đó, bạn mất chức năng thực sự có định hướng được đặt thành những gì bạn muốn.
nhà phát triển Android

2

Tôi đã gặp lỗi này khi tôi cố gắng chụp ảnh hoặc lấy hình ảnh từ thư viện, điều làm việc cho tôi là xóa cả hai

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

android:screenOrientation="portrait"

bây giờ hoạt động của tôi đang sử dụng chủ đề này:

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

Điều này không hoạt động, vì windowIsFloatinggây ra sự cố tương tự như windowIsTranslucent.
nhà phát triển Android

2

Chỉ 8.0.0 ném ngoại lệ, trên 8.0 đã loại bỏ ngoại lệ

8.0.0 ném ngoại lệ


Android 7, 7.1, 8.0, 8.1 đều có vấn đề này
Hamed Jaliliani

appInfo.targetSdkVersion > Oném ngoại lệ
Mingo

Nó kiểm tra targetphiên bản sdk. Không quan trọng phiên bản sdk nào mà thiết bị thực sự đang chạy, bạn đang biên dịch dựa trên Android O (28) nhưng không tuân theo các quy ước của phiên bản nền tảng đó.
Stewiko99

2

Điều duy nhất làm việc cho tôi là thay đổi

android:screenOrientation="portrait"

đến

android:screenOrientation="unspecified"

trong bảng kê khai cho tất cả các hoạt động mờ.

Theo cách đó, nó tương thích với tất cả các phiên bản API do hoạt động mờ dường như kế thừa hướng của nó từ hoạt động chính kể từ targetApi: 28 .

Các phong cách có thể được để lại như nó được bao gồm <item name="android:windowIsTranslucent">true</item>.


Đã thử giải pháp này, nhưng ứng dụng vẫn gặp sự cố
anber

Nhưng sau đó, bạn mất chức năng thiết lập định hướng
nhà phát triển Android

@androiddeveloper: Cách tôi hiểu nó, định hướng sẽ được kế thừa từ hoạt động chính. Nếu bạn muốn đặt rõ ràng một định hướng khác cho hoạt động mờ không hoạt động theo cách này ...
Max Heimer

Đôi khi bạn không thể kiểm soát Hoạt động trước đó. Đôi khi bạn muốn hiển thị cái trong suốt của bạn lên trên những gì người dùng hiện đang nhìn thấy. Vì vậy, điều này không thể giúp :(
nhà phát triển Android

2

Sử dụng

android:screenOrientation="behind"

Và chủ đề

<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

Tôi không biết đây là lỗi từ Google hay hành vi có chủ đích nhưng tôi (ít nhất là trong giây lát) đã giải quyết nó bằng cách thay đổi compileSdkVersion và targetSdkVersion trở lại 26 trong Gradle ...


3
Bạn không nên hạ thấp mức mục tiêu. Ứng dụng của bạn cuối cùng sẽ bị chặn khỏi cửa hàng chơi. Luôn nhắm mục tiêu Android Api mới nhất android-developers.googleblog.com/2017/12/ trên
Shmuel

1
@Shmuel: sai rồi. Bạn có thể nhắm mục tiêu 26 và có sẵn trên 28 trên cửa hàng.
Regis_AG

1
Chính xác, tôi đã viết 'cuối cùng' nếu bạn xây dựng ứng dụng của mình nhắm mục tiêu cấp độ api cũ hơn, bạn sẽ ở trong một thế giới đau khổ khi bạn buộc phải cập nhật
Shmuel

Đây không phải là một giải pháp mà là một cách giải quyết. Một ngày nào đó bạn phải chuyển ứng dụng của mình sang 28 và do đó!
sud007

1

Nếu bạn chưa giải quyết vấn đề của mình, chỉ cần đăng ký hoạt động quảng cáo trong bảng kê khai như thế này:

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

Bạn cũng cần cập nhật lên phiên bản mới nhất của sdk.


1

Có thể bạn đang hiển thị Activity trông giống như Hộp thoại (không toàn màn hình), vì vậy hãy xóa screenOrientation khỏi Manifest hoặc khỏi mã. Điều này sẽ khắc phục vấn đề.


Hmm rất lạ, đối với tôi đó là trường hợp. Hãy thử chạy ứng dụng trên các phiên bản Android khác nhau, xem kết quả này có thể giúp gì cho bạn ...
Balflear

1

Điều này xảy ra sau 27, sử dụng thay thế targetSdkVersion 26, đợi google sửa nó


2
Vui lòng cung cấp bất kỳ tài liệu tham khảo (liên kết hoặc trích dẫn) khi đăng câu trả lời. Vì vậy, người dùng trong tương lai có thể hiểu dễ dàng. Ngoài ra, chào mừng đến với Cộng đồng SO .
Mohammedsalim Shivani

@MohammedsalimShivani Tại đây: suetracker.google.com/issues/68454482#comment4 "Nhóm kỹ thuật của chúng tôi đã khắc phục vấn đề này. Nó sẽ có sẵn trong một bản phát hành Android trong tương lai, vì vậy hãy theo dõi các ghi chú phát hành."
nhà phát triển Android

Đây là lời khuyên tồi
Chris

0

Tôi vừa xóa các thẻ "dọc" khỏi các thành phần không toàn màn hình và mọi thứ đều ổn.

android:screenOrientation="portrait"

0

Vui lòng kiểm tra kiểu Hoạt động của bạn và đảm bảo nếu bạn không sử dụng bất kỳ thứ gì liên quan đến Dịch, thay đổi kiểu thành thay thế. Để chúng tôi có thể khắc phục vấn đề này.

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

0

Tôi đã giải quyết vấn đề này bằng cách xóa android:screenOrientation="portrait"và thêm mã bên dưới vào onCreate của tôi

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

trong khi thuộc tính chủ đề của tôi là

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.