onConfigurationChanged tidak dipanggil

141

Pagi ini saya muncul dengan masalah mencoba menangani onConfigurationChangedacara tersebut. Masalahnya adalah bahwa metode, yang saya timpa, tidak dipanggil ketika saya mengubah orientasi telepon. Tidak dipanggil sama sekali.

Saya telah menggunakan android:configChanges="orientation"aktivitas yang didefinisikan dalam manifes sebagaimana disebutkan pada dokumentasi android, tetapi ini tidak membuat perbedaan.

Sudahkah Anda menemukan masalah ini?

lblasa
sumber
1
Saya mengalami masalah yang sama untuk android: configChanges = "keyboardHidden" - onConfigurationChanged tidak dipanggil saat keyboard lunak meluncur masuk atau keluar.
Pieter Witvoet
keyboardHidden tidak dipicu oleh keyboard perangkat lunak, hanya oleh keyboard perangkat keras, seperti keyboard geser pada Droid.
nmr
10
Anda harus menambahkan "screenSize" di android:configChanges Inilah yang dikatakan google javadoc: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974
@ Ektos974 bagus! menambahkan screenSize mendapat panggilan di Konfigurasi diubah!
Manuela
Hai, saya menggunakan tema Theme.Holo.Light.NoActionBar. Untuk yang ini, aktivitas saya mulai ulang. Apakah ada cara untuk menghindari aktivitas untuk memulai kembali?
Manukumar

Jawaban:

250

Ini adalah gremlin saya untuk ~ masalah yang sama:

Perhatian: Dimulai dengan Android 3.2 (API level 13), "ukuran layar" juga berubah ketika perangkat beralih antara orientasi potret dan lanskap. Dengan demikian, jika Anda ingin mencegah restart runtime karena perubahan orientasi ketika mengembangkan untuk API level 13 atau lebih tinggi (sebagaimana dinyatakan oleh atribut minSdkVersion dan targetSdkVersion), Anda harus menyertakan nilai "screenSize" sebagai tambahan nilai "orientasi". Artinya, Anda harus decalare android: configChanges = "orientasi | screenSize". Namun, jika aplikasi Anda menargetkan API level 12 atau lebih rendah, maka aktivitas Anda selalu menangani perubahan konfigurasi itu sendiri (perubahan konfigurasi ini tidak memulai kembali aktivitas Anda, bahkan ketika berjalan pada perangkat Android 3.2 atau lebih tinggi).

(Dari http://developer.android.com/guide/topics/resources/runtime-changes.html )

TL; DR: tambahkan "| screenSize" ke configChanges saat menargetkan API level 13+

nm
sumber
9
wow, hanya satu atribut yang akan ditambahkan dan itu saja, +1dari sisi saya "screenSize"itu.
Anuj
@ philipp Apa yang akan dicapai pengaturan orientasi sensor? Tidak yakin bagaimana itu akan membantu. Terima kasih untuk hasil editnya.
nmr
4 tahun kemudian orang masih digigit oleh ini :)
Daniel Wilson
Terima kasih. Menghabiskan 30 menit memukul kepalaku ke dinding.
lago
Ini adalah solusi sempurna
Anbarasu Chinna
40

Beberapa perangkat 4.0 tidak memanggilConfigurationChanged. Cukup tambahkan pendengar ke screenSize juga.

android:configChanges="orientation|screenSize"
Corbella
sumber
Ini menyelesaikan masalah saya. Mengganti onConfigurationChanged, menguji Configuration.ORIENTATION_LANDSCAPE, dan termasuk HANYA android:configChanges="orientation"dalam manifes tidak cukup untuk tablet Nexus 7 saya. Terima kasih
Jantzilla
37

Masalahnya adalah jika Anda menggunakan metode ini

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

untuk memaksa orientasi Anda Activityke mode potret, Anda bukan kandidat yang akan menerima orientationperubahan.

Jadi solusinya adalah tidak setRequestOrientationke mode tertentu. Namun alih-alih gunakanSCREEN_ORIENTATION_SENSOR.

lblasa
sumber
5
ya, itu berhasil, tetapi bagaimana jika saya tidak ingin aplikasi saya diputar? saya ingin tetap dalam mode lansekap.
stoefln
Anda harus menentukan <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> dalam file menifest Anda
Qadir Hussain
3
Bagaimana cara saya menggunakan ini (ketika pengguna mengklik "layar penuh" pada pemutar video), DAN terus menerima onConfigChangedjuga, ketika pengguna memutar teleponnya. Perilaku yang sama seperti di aplikasi youtube. Ini mungkin?
Vucko
29

periksa apakah perangkat Anda memiliki pengaturan "Rotasi layar" AKTIF

Pengaturan "Rotasi layar"

Dmitry Kolesnikovich
sumber
7
Saya memiliki masalah lucu ini ...: D
Dharmendra
Apakah mungkin untuk memutar aktivitas meskipun opsi "Rotasi layar" MATI ?. Jika YA, tolong beri tahu saya cara melakukan itu ......? Sesuai, pemahaman saya itu tidak akan berfungsi tetapi beberapa aplikasi memutar aktivitas ke lanskap.
Srinivasan
1
S ** t !!! Menghabiskan 4-5 jam mencoba agar kode saya berfungsi! Cara untuk mengesampingkan ini, karena saya belajar dari jawaban lain adalah dengan memasukkan <android: orientasi = "sensor"> dalam manifes
suku
19
  1. Pastikan Anda tidak menggunakan android:screenOrientationdalam Activityatau dalam aApplication tingkat.
  2. Coba gunakan android:configChanges="orientation|keyboardHidden"sebagai gantinya.
Makarse
sumber
1
bagaimana saya bisa menggunakan android: screenOrientation dan saya ingin menjalankan metode onConfigurationChanged, apa yang bisa saya lakukan, thx
Bingchean
17

Saya menghabiskan waktu puluhan menit untuk mencari tahu mengapa itu tidak berhasil. saya tambahkanscreenSize tetapi masih tidak berhasil.

Ternyata saya telah menambahkan android:configChangeske <application>elemen, bukan ke<activity> elemen seperti yang seharusnya!

Tentu saja, ini adalah kesalahan saya, tetapi kita semua tahu bahwa kita semua menghabiskan banyak waktu untuk kesalahan konyol semacam ini. Jadi, saya menambahkan jawaban ini untuk berjaga-jaga kalau-kalau harus ada programmer konyol lain seperti saya.

Sayuran Sialan
sumber
Saya juga melakukan hal yang sama, Terima kasih Anda menyelamatkan saya
Pranoy Sarkar
Ho Terima kasih kawan!
Laurent
14

Macarse 100% uang dengan opsi ke-2.

Mencoba android:configChanges="orientation|keyboardHidden|screenSize"

Saya memiliki masalah yang sama persis, dan pada emulator 1.6 menambahkan keyboardHiddenpenyebab onConfigurationChangeddipanggil selama rotasi. Hapus dan berhenti dipanggil.

William
sumber
5

Saya memiliki masalah yang sama - onConfigurationChangedtidak dipanggil saat perangkat mengubah orientasi meskipun ada android:configChanges="orientation|keyboardHidden"dalam file manifes. Saya menggunakan potongan kode yang dibagikan Devadi sini

orientasi tidak berfungsi di 2.3.3?

untuk memeriksa apakah onConfigurationChangedsedang dipanggil. Bukan itu.

Setelah beberapa jam bereksperimen, saya menyadari bahwa saya memiliki baris berikut dalam file manifes

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

dan saat berganti android:targetSdkVersion="15"ke android:targetSdkVersion="8", onConfigurationChangedmulai dipanggil. Jadi, bagian dari manifes akhirnya terlihat seperti ini

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
Pembelajar
sumber
9
Masalah yang Anda hadapi adalah atribut yang hilang: screensize. Harap perbarui jawaban Anda. Ini akan menjadi "perbaikan" yang menyesatkan untuk pengembang
andriod pemula
@ user1281750 Terima kasih, tetapi sebagai pengembang Android pemula saya sendiri, saya tidak yakin apa yang sebenarnya Anda katakan.
Pelajar
@ aLearner Saya pikir apa yang dimaksud user1281750: Ini sebenarnya bukan perbaikan! Bagaimana jika Anda memerlukan versi SDK yang lebih tinggi?
AgentKnopf
Saya berbagi apa yang berhasil untuk saya. Saya menyadari bahwa ini mungkin bukan perbaikan. Tapi apa alternatifnya? Apa solusi yang benar? Dan apa yang dimaksud dengan yang 'hilang attribute: screensize'? Mungkin bermanfaat jika ada lebih banyak rincian yang diberikan.
aLearner
Terima kasih sobat solusi ini memecahkan ketegangan besar saya lol .. Saya sedang berselancar selama satu jam untuk mendapatkan ini ... itu bekerja di semua versi yang diperbarui juga
Sampath Kumar
3

Saya baru saja menemukan itu jika Anda memiliki:

android:screenOrientation="landscape"

dalam manifes, onConfigurationChanged () tidak akan dipanggil juga ...

ini mungkin mirip dengan:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

orientasi pengaturan itu memblokir onConfigurationChanged ().

Nick Jian
sumber
3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Jangan gunakan versi target SDK apa pun untuk membuat Anda kesulitan. dan untuk semua level api gunakan ini sebagai pendengar perubahan konfigurasi

android:configChanges="orientation|keyboardHidden|screenLayout"
Sampath Kumar
sumber
3

Tidak yakin ini adalah tempat terbaik untuk itu, tetapi dalam menghadapi masalah ini - saya mengamati sesuatu yang menarik.

Jika pendengar onConfigurationChanged () TIDAK berfungsi, maka onCreate () dipanggil lagi setiap kali orientasi diubah.

Jika pendengar onConfigurationChanged () berfungsi, maka metode itu disebut sebagai ganti onCreate () ketika orientasi berubah.

Gene Bo
sumber
Ini yang saya lihat - tapi saya tidak mau. Dan menurut dokumen itu seharusnya tidak terjadi seperti ini. Sangat membingungkan.
slycrel
2

Semua solusi tidak berfungsi, saya mencoba untuk menghapus aktivitas tema saya di file manifes Android. Sangat aneh

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>
thanhbinh84
sumber
Apakah ada cara untuk menghindari aktivitas untuk memulai kembali tanpa menghapus windowNoTitle?
Manukumar
2

Tidak ada saran yang bekerja untuk saya (saya telah bereaksi proyek asli dengan masalah ini), tetapi setelah berjam-jam debug saya menemukan bahwa jika Anda memiliki baris ini di AppTheme of styles.xml

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

maka aplikasi tidak akan berputar.

Matej Ukmar
sumber
1

@ thanhbinh84 Memberi saya ide apa yang menyebabkan ini.
Menghapus <item name="android:windowIsTranslucent">true</item> dari tema saya di styles.xml memperbaikinya!

Nitsan
sumber
0

Saya memiliki masalah yang sama dan saya memiliki "android: screenOrientation" dan "android: configChanges" yang ditentukan dalam manifes. Ketika saya menghapus yang pertama, onConfigurationChanged () dipanggil rotasi. Aneh tapi itu wajan)

Campuran
sumber
1
Tetapi bagaimana Anda memutar itu?
Mark Molina
-2

Sudahkah Anda mendapatkan android.content.res.Configurationlaporan impor? Eclipse dapat memasukkan impor secara otomatis jika Anda menekan Ctrl+Shift+O.

Jika itu hilang, kompiler tidak akan dapat mengenali bahwa Anda mengganti metode superclass secara sah sehingga akan menimbulkan kesalahan.

Tandai Mooibroek
sumber
Ya, impor sudah ada, ada ide? karena saya tidak mendapatkan kesalahan atau apa pun, hanya saja itu tidak dipanggil.
lblasa
Saya tidak tahu apakah ini bisa dikaitkan dengan fakta bahwa semua aplikasi sedang dibuat dalam mode potret. Aktivitas di mana saya perlu menangani onConfigurationChangedEvent adalah aktivitas yang terdapat di dalam TabHost yang modenya adalah portrait. Tapi bagaimanapun, saya belum menemukan komentar ini menjadi masalah untuk menangkap acara itu. Saya benar-benar kehabisan ide.
lblasa