Saya baru saja menerapkan fitur perubahan orientasi - misalnya saat tata letak berubah dari potret ke lanskap (atau sebaliknya). Bagaimana saya bisa mendeteksi ketika acara perubahan orientasi selesai.
Itu OrientationEventListener
tidak berhasil. Bagaimana saya bisa mendapatkan pemberitahuan tentang peristiwa perubahan orientasi tata letak?
Jawaban:
Gunakan metode onConfigurationChanged dari Aktivitas. Lihat kode berikut:
Anda juga harus mengedit yang sesuai elemen dalam file manifes Anda untuk menyertakan android: configChanges Lihat saja kode di bawah ini:
CATATAN: dengan Android 3.2 (API level 13) atau yang lebih tinggi, "ukuran layar" juga berubah saat perangkat beralih antara orientasi potret dan lanskap. Jadi, jika Anda ingin mencegah waktu proses dimulai ulang karena perubahan orientasi saat mengembangkan API level 13 atau lebih tinggi, Anda harus mendeklarasikan android: configChanges = "orientasi | screenSize" untuk API level 13 atau lebih tinggi .
Semoga ini bisa membantu Anda ... :)
sumber
Untuk memuat layout di folder layout-land berarti anda memiliki dua layout terpisah maka harus anda buat
setContentView
dionConfigurationChanged
metode.Jika Anda hanya memiliki satu layout maka tidak perlu membuat setContentView dalam metode ini. secara sederhana
sumber
onConfigurationChanged(Configuration newConfig)
metode (seperti dalam jawaban ini), tetapi alih-alih menanganinya sendiri, saya menetapkan flag Boolean dan kemudian memanggilrecreate()
metode tersebut sehingga Android membuat ulang aktivitas dengan cara normal.recreate()
metode ini adalah ini menyebabkan layar berkedip hitam sebentar. Untuk alasan ini saya menggunakan pendekatan lain: (1) simpan lebar layar dionCreate(...)
, (2) bandingkan lebar layar yang disimpan dengan lebar layar saat ini dalam metode siklus-hidup saat aktivitas dihentikan (misalnyaonSaveInstanceState(...)
).Hanya ingin menunjukkan cara menyimpan semua Bundel Anda setelah onConfigurationChanged:
Buat Bundel baru tepat setelah kelas Anda:
Selanjutnya, setelah "protected void onCreate" tambahkan ini:
Jika Anda menambahkan ini, semua kelas Anda yang terkurung ke dalam MainActivity akan disimpan.
Tetapi cara terbaik adalah dengan menambahkan ini di AndroidManifest Anda:
sumber
onConfigurationChanged()
membuatnya jadi instanceState Anda tidak dihancurkan saat orientasi berubah, jadi Anda tidak perlu menyimpannya. Anda mungkin ingin menyimpannya untuk acara lain dalam daur hidup aktivitas, tapi saya tidak tahu.gunakan metode ini
Dan jangan lupa untuk menambahkan ini di Androidmainfest.xml Anda
seperti ini
sumber
Ganti metode aktivitas onConfigurationChanged
sumber
Saya hanya ingin mengusulkan alternatif lain yang akan menjadi perhatian sebagian dari Anda, seperti yang dijelaskan di atas:
menyiratkan bahwa kami secara eksplisit mendeklarasikan tata letak yang akan diinjeksi.
Jika kami ingin mempertahankan injeksi otomatis berkat folder tata letak-tanah dan tata letak. Yang harus Anda lakukan adalah menambahkannya ke onCreate:
Di sini, kami menampilkan atau tidak bilah tindakan tergantung pada orientasi ponsel
sumber
Buat instance
OrientationEventListener
kelas dan aktifkan.sumber
Jika jawaban yang diterima tidak berhasil untuk Anda, pastikan Anda tidak menentukan dalam file manifes:
Yang mana kasus saya.
sumber
Dalam hal ini digunakan untuk beberapa pengembang yang lebih baru karena tidak ditentukan di atas. Hanya untuk menjadi sangat eksplisit:
Anda memerlukan dua hal jika menggunakan onConfigurationChanged :
Sebuah
onConfigurationChanged
metode dalam Anda Kelas AktivitasTentukan dalam manifes Anda perubahan konfigurasi mana yang akan ditangani oleh
onConfigurationChanged
metode AndaCuplikan manifes dalam jawaban di atas, meskipun tidak diragukan lagi benar untuk aplikasi tertentu yang memiliki manifes, BUKAN persis seperti yang perlu Anda tambahkan dalam manifes untuk memicu metode onConfigurationChanged di Kelas Aktivitas Anda. yaitu entri manifes di bawah ini mungkin tidak benar untuk aplikasi Anda.
Dalam entri manifes di atas, ada berbagai tindakan Android
android:configChanges=""
yang bisa memicu onCreate dalam siklus hidup Aktivitas Anda.Ini sangat penting - Yang TIDAK Ditentukan dalam manifes adalah yang memicu onCreate Anda dan Yang ditentukan dalam manifes adalah yang memicu
onConfigurationChanged
metode Anda Anda di Kelas Aktivitas.Jadi, Anda perlu mengidentifikasi perubahan konfigurasi mana yang perlu Anda tangani sendiri. Untuk Android Encyclopedically Challenged seperti saya, saya menggunakan pop-out petunjuk cepat di Android Studio dan menambahkan di hampir setiap opsi konfigurasi yang memungkinkan. Mendaftar semua ini pada dasarnya mengatakan bahwa saya akan menangani semuanya dan onCreate tidak akan pernah dipanggil karena konfigurasi.
Sekarang jelas saya tidak ingin menangani semuanya, jadi saya mulai menghilangkan opsi di atas satu per satu. Membangun kembali dan menguji aplikasi saya setelah setiap penghapusan.
Poin penting lainnya : Jika hanya ada satu opsi konfigurasi yang ditangani secara otomatis yang memicu onCreate Anda (Anda tidak memilikinya tercantum dalam manifes Anda di atas), maka akan muncul seperti
onConfigurationChanged
tidak berfungsi. Anda harus memasukkan semua yang relevan ke dalam manifes Anda.Saya berakhir dengan 3 yang awalnya memicu onCreate, kemudian saya menguji S10 + dan saya masih mendapatkan onCreate, jadi saya harus melakukan latihan eliminasi lagi dan saya juga membutuhkan
|screenSize
. Jadi uji pada beberapa platform.Jadi saran saya, meskipun saya yakin seseorang bisa membuat lubang di sini:
Tambahkan
onConfigurationChanged
metode Anda di Kelas Aktivitas dengan TOAST atau LOG sehingga Anda dapat melihat kapan metode tersebut berfungsi.Tambahkan semua opsi konfigurasi yang memungkinkan ke manifes Anda.
Konfirmasikan bahwa
onConfigurationChanged
metode Anda berfungsi dengan menguji aplikasi Anda.Hapus setiap opsi konfigurasi dari file manifes Anda satu per satu, uji aplikasi Anda setelahnya.
Uji pada sebanyak mungkin variasi perangkat.
Jangan salin / tempel cuplikan saya di atas ke file manifes Anda. Pembaruan Android mengubah daftar, jadi gunakan petunjuk Android Studio yang muncul untuk memastikan Anda mendapatkan semuanya.
Saya harap ini menghemat waktu seseorang.
onConfigurationChanged
Cara saya hanya untuk info dibawah ini.onConfigurationChanged
dipanggil dalam siklus proses setelah orientasi baru tersedia, tetapi sebelum UI dibuat ulang. Oleh karena itu pertama sayaif
untuk memeriksa orientasi berfungsi dengan benar, dan kemudian bersarangif
ke -2 untuk melihat visibilitas UI ImageView saya juga berfungsi dengan benar.sumber
untuk implementasi Kotilin dalam bentuk yang paling sederhana - hanya aktif saat layar berubah dari potret <--> lanskap jika perangkat memerlukan deteksi balik (180 derajat), Anda harus memasukkan nilai sensor gravitasi
sumber