java.lang.IllegalStateException: Hanya aktivitas buram layar penuh yang dapat meminta orientasi

187

Saya menghadapi masalah saat mengambil kontak dari buku kontak di Android 8.0 Oreo java.lang.IllegalStateException: Hanya aktivitas buram layar penuh yang dapat meminta orientasi

Saya mencoba mendapatkan kontak dalam aktivitas saya dari buku kontak telepon dan berfungsi sempurna untuk Lollipop, Marshmallow, Nougat, dll. Tetapi itu akan memberi saya kesalahan untuk Oreo seperti ini tolong bantu saya. Kode saya ada di sini di bawah ini.

Kode Demo: -

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

Catatan eror:-

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
Shubham Sejpal
sumber
1
ini dapat membantu Anda stackoverflow.com/questions/46980697/…
Nilesh Rathod
periksa ini juga: stackoverflow.com/questions/46980697/…
yash786
1
Sudah mencoba semua saran tetapi tidak ada yang bekerja untuk saya.
Shubham Sejpal
1
apakah Anda menggunakan android: screenOrientation = "portrait" dalam manifes?
Ragesh Ramesh

Jawaban:

63

Masalahnya tampaknya terjadi ketika target sdk Anda adalah 28. Jadi setelah mencoba banyak opsi akhirnya ini berhasil.

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

gaya:-

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

Catatan: parent = "Theme.AppCompat.Light.NoActionBar" diperlukan untuk api 28. Sebelumnya memiliki sesuatu yang lain di api 26. Bekerja dengan baik tetapi mulai memberi masalah pada 28. Semoga ini membantu seseorang di sini. EDIT: Untuk beberapa hanya dengan menetapkan bekerja. <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> Mungkin tergantung pada cara Anda menerapkan solusi bekerja. Dalam kasus saya itu bekerja dengan mengaturnya menjadi benar.

Debasish Ghosh
sumber
23
Kepada siapa pun yang menemukan "perbaikan" ini saya harus mengatur <item name="android:windowIsTranslucent">false</item>dan juga harus mengatur <item name="android:windowIsFloating">false</item>sebelum itu akan berhasil.
th317erd
8
Di mana tepatnya solusi untuk ini? Tidak ada screenOrientationatribut dalam activitytag, dan satu-satunya hal yang menyebabkan kerusakan screenOrientationdiatur saat android:windowIsTranslucentdisetel ke true.
pengembang android
Ini tidak berfungsi, kecuali komentar di atas digunakan. Lihat jawaban oleh Radesh, yang mencakup komentar di atas, dan banyak lagi, dan jelas
arberg
Mengatur tembus ke pekerjaan salah untuk saya <item name = "android: windowIsTranslucent"> false </item>
Tran Quan
Dalam kasus saya, solusinya adalah menghapus 'android: theme' dari Activity di AndroidManifest.xml. Tetapi jika Anda membutuhkannya, Anda dapat menambahkannya secara terprogram sebelum 'super.onCreate': setTheme (R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin
133

Di android Oreo (API 26) Anda tidak dapat mengubah orientasi untuk Aktivitas yang memiliki gaya di bawah garis

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

atau

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

Anda memiliki beberapa cara untuk menyelesaikan ini:

1) Anda cukup menghapus baris di atas (atau mengubahnya menjadi false ) dan aplikasi Anda berfungsi dengan baik.

2) Atau Anda dapat terlebih dahulu menghapus baris di bawah ini dari manifes untuk aktivitas itu

android:screenOrientation="portrait"

Maka Anda harus menambahkan baris ini ke aktivitas Anda (di onCreate ())

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

3) Anda dapat membuat baru styles.xmldi values-v26folder dan menambahkan ini ke Anda style.xml. (Terima kasih atas komentar AbdelHady )

 <item name="android:windowIsTranslucent">false</item>
 <item name="android:windowIsFloating">false</item>
Radesh
sumber
25
di Android PIE ini berfungsi seperti yang diharapkan. Jadi ceknya benar-benar harus:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco
@ avisper bisa tolong bagikan kode kondisi lengkap
Manikandan K
Dalam perangkat / emulator yang menjalankan API 26, opsi 2 tidak berfungsi, saya harus membuat styles.xmlin baru values-v26untuk menonaktifkan android:windowIsTranslucentAPI saja.
AbdelHady
@AbdelHady Solusi yang bagus, saya akan menambahkannya ke jawaban saya tetapi memeriksa kode Anda dan baik-baik saja mengapa opsi 2 tidak berfungsi, bahwa opsi yang saya sarankan,
Radesh
1
Saya menggunakan opsi 3 dengan nilai boolean <bool name="allowWindowFullScreenTranslucent">true</bool>dan merujuknya pada <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Kemudian di styles.xml di bawah nilai-v26 atur ke falsedan dalam nilai-nilai dan nilai-v27 atur ke true.
drorsun
87

Di Android O dan kemudian kesalahan ini terjadi ketika Anda mengatur

 android:screenOrientation="portrait"

dalam Manifest.

Hapus garis itu dan gunakan

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

dalam aktivitas Anda.

Ini akan memperbaiki masalah Anda.

Ragesh Ramesh
sumber
7
Ini bug dari sisi google. Harus diperbaiki di masa depan pembaruan. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); akan membatasi aplikasi Anda untuk masuk ke lanskap. Pastikan Anda menggunakan ini untuk membuat semua aktivitas Anda.
Ragesh Ramesh
44
Menghapus <item name="android:windowIsTranslucent">true</item> dari gaya saya yang mewarisi dari Theme.AppCompat.Light.NoActionBar bekerja untuk saya.
shadowsheep
16
Solusi ini berfungsi, tetapi mengacaukan splashScreenTheme saya. Malu di Google karena seringnya peluncuran yang ceroboh ...
doctorram
3
"Ditujukan" untuk memecah aplikasi yang berfungsi pada versi sebelumnya? Tujuan itu pasti tercapai. Setidaknya kami punya solusi, terima kasih kepada @Ragesh
Oleg Gryb
9
Mengganti atribut manifes dengan mengatur orientasi pada kelas Activity tidak menyelesaikan masalah.
rmgoncalo
75

Google melempar pengecualian ini pada onCreatemetode Activity setelah v27, artinya adalah: jika suatu Aktivitas tembus atau mengambang, orientasinya harus bergantung pada Aktivitas induk (latar belakang), tidak dapat membuat keputusan sendiri.

Bahkan jika Anda menghapus android:screenOrientation="portrait"dari Kegiatan mengambang atau tembus tetapi memperbaiki orientasi pada aktivitas induknya (latar belakang), itu masih diperbaiki oleh induknya, saya sudah menguji.

Satu situasi khusus: jika Anda membuat tembus pada Kegiatan peluncur, itu bukan induk (latar belakang), jadi selalu putar dengan perangkat. Ingin memperbaikinya, Anda harus mengambil cara lain untuk mengganti <item name="android:windowIsTranslucent">true</item>gaya.

Steven Sun
sumber
2
Saya tidak memiliki masalah ini pada OnePlus saya yang menjalankan Android PIE. Jadi ini bukan setelah v27, tetapi ketika v! = 28
Entreco
Apakah Anda memiliki tautan ke dokumentasi untuk ini? Sepertinya saya tidak dapat menemukannya.
Shivam Verma
masalah transparan benar-benar gila, terima kasih, itu memperbaiki masalah saya
Abhishek Garg
Terima kasih telah memperhatikan bagian terakhir 'Satu situasi khusus ...'
guy_m
Ini harus menjadi jawaban yang diterima. Masuk akal!
stoefln
29

Jika Anda menggunakan aktivitas transparan layar penuh, tidak perlu menentukan kunci orientasi pada aktivitas. Ini akan mengambil pengaturan konfigurasi aktivitas induk. Jadi jika aktivitas induk ada di manifes:

android: screenOrientation = "portrait"

aktivitas tembus cahaya Anda akan memiliki kunci orientasi yang sama: potret.

gellyke
sumber
Saya pikir Anda membuat kesalahan ketik kecil: seharusnya "jika Anda menggunakan aktivitas transparan layar penuh, itu akan mengambil pengaturan konfigurasi aktivitas induknya" ^^
Josselin
2
Bagaimana jika aktivitas transparan saya adalah aktivitas launcher saya (yaitu splash screen)
Bhupesh
2
Apakah ini benar untuk semua versi Android? Atau hanya Android O dan yang lebih tinggi?
abhiank
Ini tidak akan berfungsi jika ini adalah satu-satunya Aktivitas yang sedang digunakan, (contoh: memulainya dari Layanan)
pengembang android
24

Saya menggunakan android:screenOrientation="behind"bukan android:screenOrientation="portrait". Pada dasarnya, Anda membuat dialog (dalam suatu aktivitas) dan dialog tidak dapat meminta orientasi dengan sendirinya. Diperlukan aktivitas induk untuk melakukan ini (karena orangtua terlihat di latar belakang dan memiliki tata letak sendiri).

"belakang" Orientasi yang sama dengan aktivitas yang tepat di bawahnya di tumpukan aktivitas.

Paul
sumber
Bagaimana jika saya ingin agar Kegiatan yang saya buat transparan, menunjukkan apa yang ada di bawahnya (termasuk aplikasi lain), sambil tetap mengikuti orientasi saat ini? Jika saya membiarkannya "tertinggal", masih bisa mengubah orientasi pada berbagai kasus ...
pengembang android
19

Satu-satunya solusi yang benar-benar berfungsi:

Perubahan:

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

untuk:

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

di styles.xml

Tapi ini mungkin menyebabkan masalah dengan splashscreen Anda (layar putih saat startup) ... Dalam hal ini, tambahkan baris berikut ke styles.xml Anda:

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

tepat di bawah garis windowIsTranslucent.

Kesempatan terakhir jika tips sebelumnya tidak berhasil: target SDK 26 bukannya o 27.

Regis_AG
sumber
1
Mengubah target SDK ke 26 bukannya 27 bekerja untuk saya. Mengubah windowIsTranslucent tidak.
Cliche818
Ini berfungsi untuk saya dengan menggunakan targetSDK: 27. Ini sangat penting karena saya telah mengkonfigurasi splashscreen.
Leonardo G.
18

Jika Anda harus menggunakan setRequestedOrientation(), tidak ada cara lain selain mengorbankan atribut windowIsTranslucent di Android 8.0

values\styles.xml untuk api level 25- (<8.0)

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

values-v26\styles.xml untuk api level 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 untuk api level 27+ (> 8.0)

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

Banyak orang telah memberikan perbaikan, jadi saya akan berbicara tentang sumber masalahnya.

Menurut log pengecualian :

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)

Kode yang memicu pengecualian di 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;
        }

Menurut analisis kode di atas, ketika TargetSdkVersion> = 27, ketika menggunakan SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT, dan atribut terkait lainnya, penggunaan windowIsTranslucent, windowIsFloating, dan windowSwipeToDismiss atribut akan memicu pengecualian.

Setelah masalah ditemukan, Anda dapat mengubah TargetSdkVersion atau menghapus atribut terkait tema sesuai dengan kebutuhan Anda.

Bingerz
sumber
1
Memeriksa kode pada master saat ini, sudah dihapus dari framework: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Sangat menarik untuk melihat pesan komit.
Erick M. Sprengel
Bisakah Anda menunjukkan tautan ke kode sumber bagian ini? Apakah ada solusi yang akan membuat saya memiliki Kegiatan dengan orientasi spesifik DAN memiliki latar belakang transparan, sehingga akan mungkin untuk melihat apa yang ada di baliknya (termasuk aplikasi lain)?
pengembang android
8

Saya tidak bisa menyetujui jawaban yang dinilai paling tinggi, karena

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

menyebabkan kesalahan

java.lang.IllegalStateException: Hanya aktivitas buram layar penuh yang dapat meminta orientasi

tetapi ini membuatnya bekerja untuk saya

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

dan gunakan untuk Aktivitas Anda, saat Anda memanjang dari

InterstitialActivity extends AppCompatActivity

di AndroidManifest.xml

    <activity
        android:name=".InterstitialActivity"
        ...
        android:screenOrientation="portrait"
        android:theme="@style/TranslucentTheme" />
hannes ach
sumber
<item name = "android: windowIsTranslucent"> false </item> <item name = "android: windowFullscreen"> true </item> => ini memperbaikinya untuk saya di android 8.0. Saya masih bisa meninggalkan screenOrientation di manifes.
Frank
1
Ini tidak bekerja sama dengan windowIsTranslucent, karena sekarang Anda tidak dapat melihat apa yang ada di balik Kegiatan.
pengembang android
8

Hapus saja baris android:screenOrientation="portrait"aktivitas ini di Manifiest.xml

Aktivitas itu akan mendapatkan orientasi dari aktivitas sebelumnya sehingga tidak perlu menerapkan orientasi yang dimiliki <item name="android:windowIsTranslucent">true</item>.

Sanket Kachhela
sumber
Bagaimana jika aktivitas sebelumnya memiliki orientasi berbeda dengan yang Anda inginkan dalam aktivitas saat ini?
Kelas
6

sepertinya target sdk adalah pie (api level 28.0) dan windowIsTranslucent benar

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

dan Anda mencoba mengakses orientasi. masalah datang dengan android oreo 8.0 (api level 26) ada dua cara untuk menyelesaikan ini

  1. hapus orientasinya
  2. atau atur windowIsTranslucent ke false

jika Anda menetapkan orientasi dalam manifes seperti ini

android:screenOrientation="portrait"

atau di kelas aktivitas seperti ini

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

hapus formulir kedua tempat.

dan diamati ketika Anda mengatur windowIsTranslucent ke true, dibutuhkan orientasi dari aktivitas induk.

Avinash Jadaun
sumber
5

dalam file manifes atur aktivitas kedua parentActivityName sebagai aktivitas pertama dan hapus parameter screenOrientation ke aktivitas kedua. itu berarti aktivitas pertama Anda adalah orang tua dan memutuskan untuk orientasi aktivitas kedua Anda.

<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" />
mustafa.ertrk
sumber
5

Cukup Tetapkan Orientasi aktivitas di Manifiest.xml

android:screenOrientation="unspecified"

ATAU untuk terbatas pada Orientasi Potret

Anda juga dapat menggunakan dalam Activity, In onCreatemethod call sebelum super.onCreate(...)eg

@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);
}
Attaullah
sumber
4

Saya memiliki masalah yang sama, dan solusi saya adalah menghilangkan garis

android:screenOrientation="portrait"

dan kemudian tambahkan ini di aktivitas:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
jrivas
sumber
1
Silakan gunakan bahasa Inggris di Stack Overflow. Terima kasih!
Michael Myers
3

Setelah melakukan riset, tampaknya masalah ini mungkin disebabkan oleh bug google. Bagi saya, saya dapat meninggalkan baris ini dalam metode onCreate Aktivitas saya:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

DAN saya mengubah targetSdkVersion saya menjadi 26. Memiliki garis di onCreate saya masih menghasilkan crash sementara targetSdkVersion saya masih ditetapkan pada 27. Karena sejauh ini tidak ada solusi orang lain yang bekerja untuk saya, saya menemukan bahwa ini berfungsi sebagai perbaikan sementara untuk sekarang.

Tentu saja
sumber
1
Yang ini bekerja untuk saya dengan menetapkan targetSdkVersion ke 26, android: screenOrientation = "portrait" dan <item name = "android: windowIsTranslucent"> true </item>
siripan
@siripan untukku juga
Acauã Pitta
Tetapi pada akhirnya Anda harus menetapkan targetSdkVersion ke 28 tahun ini: support.google.com/googleplay/android-developer/answer/… . Apa yang akan kamu lakukan?
pengembang android
3

Ini adalah konflik (bug) antara Tema di dalam file style.xml dalam versi android 7 (tingkat Api 24,25) & 8 (tingkat api 26,27), saat Anda memiliki

android:screenOrientation="portrait" : di dalam aktivitas spesifik (yang macet) di AndroidManifest.xml

&

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

dalam tema yang diterapkan pada aktivitas di dalam style.xml

Ini dapat diselesaikan dengan cara-cara ini sesuai dengan kebutuhan Anda:

1- Hapus properti yang disebutkan di atas yang membuat konflik

2- Ubah orientasi Aktivitas ke salah satu dari nilai-nilai ini sesuai kebutuhan Anda: unspecifiedatau behinddan sebagainya yang dapat ditemukan di sini: Referensi Google untuk android: screenOrientation `

3- Atur orientasi secara terprogram dalam waktu berjalan

Hamed Jaliliani
sumber
Mencoba solusi ini, tetapi aplikasi masih macet: Saya membutuhkan aktivitas transparan potret jadi saya perlu kedua opsi ini. Mencoba mengatur manifes screenOrientation tidak ditentukan, tetapi tidak berhasil.
anber
Tidak. Saya mencoba menghapus orientasi dalam manifes sama sekali, dan membuat aktivitas menjadi layar penuh, tetapi masih macet. Hanya di 1 perangkat - kehormatan 9 lite. Di Samsung berfungsi dengan baik.
anber
Mengatur orientasi secara terprogram juga menyebabkan crash. Bagaimana tepatnya Anda menggunakannya?
pengembang android
@androiddeveloper bagaimana saya bisa mengakses kode sumber Anda ?! Saya harus melihat apa yang Anda lakukan
Hamed Jaliliani
@HamedJaliliani Mengaturnya sebagai programmaticaly, misalnya: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
pengembang android
3

Saya baru-baru ini menghadapi masalah dan inilah solusinya.

Tidak perlu mengubah parameter orientasi layar yang Anda atur di file manifes android.

Cukup tambahkan dua folder

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

Kemudian salin file styles.xml dan themes.xml Anda di sana.

dan ubah parameter berikut dari BENAR ke SALAH.

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

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

Itu akan berhasil.

Bug umum Android 8.0

MD. Shafiul Alam Biplob
sumber
2

Saya menghadapi masalah ini hanya di SDK 26 (8.0.0) jika menggunakan windowIsTranslucent 'true' dan secara paksa mengatur orientasi:

Inilah solusinya:

    @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>
Hamza Khan
sumber
Tetapi kemudian Anda kehilangan fungsionalitas untuk benar-benar mengatur orientasi sesuai dengan yang Anda inginkan.
pengembang android
2

Saya mendapatkan kesalahan ini ketika saya mencoba mengambil gambar atau mengambil gambar dari galeri yang berfungsi untuk saya adalah menghapus keduanya

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

dan

android:screenOrientation="portrait"

sekarang aktivitas saya menggunakan tema ini:

  <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>
Nouman Ch
sumber
Ini tidak berfungsi, karena windowIsFloatingmenyebabkan crash yang sama dengan windowIsTranslucent.
pengembang android
2

hanya 8.0.0 melempar pengecualian, di atas 8.0 telah menghapus pengecualian

8.0.0 lempar pengecualian

Mingo
sumber
Android 7, 7.1, 8.0, 8.1 semua memiliki masalah ini
Hamed Jaliliani
appInfo.targetSdkVersion > Olempar pengecualian
Mingo
Ini memeriksa targetversi SDK. Tidak masalah apa versi SDK perangkat sebenarnya berjalan, Anda mengkompilasi melawan Android O (28) tetapi tidak mengikuti konvensi versi platform itu.
Benjiko99
2

Satu-satunya hal yang berhasil bagi saya adalah berubah

android:screenOrientation="portrait"

untuk

android:screenOrientation="unspecified"

dalam manifes untuk semua kegiatan yang transparan.

Dengan cara itu kompatibel dengan semua versi API karena aktivitas tembus tampaknya mewarisi orientasinya dari aktivitas induk pada targetApi: 28.

Gaya dapat dibiarkan apa adanya <item name="android:windowIsTranslucent">true</item>.

Max Heimer
sumber
Mencoba solusi ini, tetapi aplikasi masih mogok
anber
Tapi kemudian Anda kehilangan fungsi pengaturan orientasi
pengembang android
@androiddeveloper: Cara saya memahaminya orientasi akan diwarisi dari aktivitas induk. Jika Anda ingin secara eksplisit mengatur orientasi lain pada aktivitas transparan yang tidak akan bekerja seperti ini ...
Max Heimer
Terkadang Anda tidak dapat memiliki kendali atas Aktivitas sebelumnya. Terkadang Anda ingin menampilkan transparan Anda di atas apa yang saat ini dilihat pengguna. Jadi ini tidak bisa membantu :(
pengembang android
2

Menggunakan

android:screenOrientation="behind"

Dan Tema

<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>
Mostafa Imran
sumber
1

Saya tidak tahu apakah ini bug dari Google atau perilaku yang dimaksudkan tetapi saya (setidaknya untuk sementara waktu) menyelesaikannya dengan mengubah compileSdkVersion dan targetSdkVersion kembali ke 26 di Gradle ...

Tujuh
sumber
3
Anda seharusnya tidak menurunkan level targetdk. Aplikasi Anda pada akhirnya akan diblokir dari play store. Selalu menargetkan level Android Api terbaru android-developers.googleblog.com/2017/12/...
Shmuel
1
@ Shmuel: salah. Anda dapat menargetkan 26 dan tersedia pada 28 di toko.
Regis_AG
1
Benar, saya menulis 'akhirnya' jika Anda membangun aplikasi yang menargetkan tingkat api yang lebih lama, Anda akan berada di dunia yang sakit ketika Anda dipaksa untuk memperbarui
Shmuel
Ini bukan solusi tetapi solusi. Suatu hari Anda harus memigrasi aplikasi Anda ke 28 dan karenanya!
sud007
1

Jika Anda belum menyelesaikan masalah Anda, cukup daftarkan aktivitas iklan di manifes seperti ini:

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

Anda juga perlu memperbarui ke versi SDK terbaru.

Gardax
sumber
1

Mungkin Anda menampilkan Aktivitas yang tampak seperti Dialog (non-layar penuh), jadi hapus screenOrientation dari Manifest atau dari kode. Ini akan memperbaiki masalah.

Balflear
sumber
Hmm sangat aneh, bagi saya itu yang terjadi. Coba jalankan aplikasi pada versi Android yang berbeda, lihat apa hasilnya nanti ini bisa membantu Anda ...
Balflear
1

ini terjadi setelah 27, gunakan targetSdkVersion 26 ganti, tunggu google memperbaikinya

yihang wu
sumber
2
Harap berikan referensi (tautan atau kutipan) apa pun saat mengirim jawaban. Jadi pengguna masa depan dapat mengerti dengan mudah. Juga, selamat datang di Komunitas SO .
Mohammedsalim Shivani
@MohammedsalimShivani Di Sini: issuetracker.google.com/issues/68454482#comment4 "Tim teknik kami telah memperbaiki masalah ini. Ini akan tersedia dalam rilis Android mendatang, jadi harap perhatikan catatan rilisnya."
pengembang android
Ini saran yang buruk
Chris
0

Saya baru saja menghapus tag "potret" dari elemen non-layar penuh dan semuanya berjalan dengan baik.

android:screenOrientation="portrait"
Victor Tavares
sumber
0

Silakan periksa gaya Kegiatan Anda dan pastikan jika Anda tidak menggunakan hal-hal yang berhubungan dengan Translucent, ubah gaya untuk berganti. Sehingga kami dapat memperbaiki masalah ini.

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

Saya mengatasi masalah ini dengan menghapus android:screenOrientation="portrait"dan menambahkan kode di bawah ini ke dalam onCreate saya

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

sementara sifat tema saya

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
Waheed Nazir
sumber