Dalam aplikasi Android saya, ketika saya memutar perangkat (geser keyboard) maka saya Activity
restart ( onCreate
disebut). Sekarang, ini mungkin memang seharusnya begitu, tetapi saya melakukan banyak pengaturan awal dalam onCreate
metode ini, jadi saya perlu:
- Letakkan semua pengaturan awal di fungsi lain sehingga tidak semua hilang pada rotasi perangkat atau
- Jadikan jadi
onCreate
tidak dipanggil lagi dan tata letak hanya menyesuaikan atau - Batasi aplikasi hanya potret sehingga
onCreate
tidak dipanggil.
android
rotation
android-activity
Isaac Waller
sumber
sumber
Jawaban:
Menggunakan Kelas Aplikasi
Bergantung pada apa yang Anda lakukan dalam inisialisasi Anda, Anda dapat mempertimbangkan membuat kelas baru yang memperluas
Application
dan memindahkan kode inisialisasi Anda keonCreate
metode yang ditimpa dalam kelas itu.The
onCreate
di kelas aplikasi hanya disebut ketika seluruh aplikasi yang dibuat, sehingga Aktivitas restart pada orientasi atau keyboard perubahan visibilitas tidak akan memicu itu.Adalah praktik yang baik untuk mengekspos instance kelas ini sebagai singleton dan mengekspos variabel aplikasi yang Anda inisialisasi menggunakan getter dan setter.
CATATAN: Anda harus menentukan nama kelas Aplikasi baru Anda di manifes agar dapat didaftarkan dan digunakan:
Bereaksi terhadap Perubahan Konfigurasi [UPDATE: ini sudah ditinggalkan sejak API 13; lihat alternatif yang direkomendasikan ]
Sebagai alternatif lebih lanjut, Anda dapat membuat aplikasi Anda mendengarkan acara yang akan menyebabkan perubahan orientasi dan visibilitas keyboard dimulai ulang - dan menanganinya dalam Kegiatan Anda.
Mulailah dengan menambahkan
android:configChanges
simpul ke simpul manifes Kegiatan Andaatau untuk Android 3.2 (API level 13) dan yang lebih baru :
Kemudian di dalam Activity, ganti
onConfigurationChanged
metode tersebut dan panggilsetContentView
untuk memaksa tata letak GUI agar dilakukan kembali dalam orientasi baru.sumber
android:configChanges
) harus dihindari dan digunakan hanya sebagai upaya terakhir. Harap baca Menangani Perubahan Waktu Runtime untuk informasi lebih lanjut tentang cara menangani restart dengan benar karena perubahan konfigurasi. Sebagai pengganti, untuk mempertahankan data di seluruh peristiwa rotasi, mereka tampaknya lebih suka menggunakanonSaveInstanceState Bundle
; atau sebagai @ Jon-O menyebutkan ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
lebih toleran terhadap kesalahan dan lurus ke depan.Pembaruan untuk Android 3.2 dan lebih tinggi:
sumber
Fragments
dansetRetainInstance
sebagai gantinya.screenSize
untuk Android 3.2 dan lebih tinggi, yang menyelesaikan masalah saya, Terima kasih!Alih-alih mencoba menghentikan
onCreate()
pemecatan sama sekali, mungkin mencoba memeriksaBundle
savedInstanceState
yang diteruskan ke acara untuk melihat apakah itu batal atau tidak.Sebagai contoh, jika saya memiliki beberapa logika yang harus dijalankan ketika
Activity
benar-benar dibuat, bukan pada setiap perubahan orientasi, saya hanya menjalankan logika ituonCreate()
hanya jikasavedInstanceState
nol.Kalau tidak, saya masih ingin tata letak untuk menggambar dengan benar untuk orientasi.
tidak yakin apakah ini adalah jawaban terakhir, tetapi itu bekerja untuk saya.
sumber
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
danstartService(serverintent);
untuk membuatserverSocket = new ServerSocket(0xcff2);
danSocket client = serverSocket.accept();
denganBufferedReader(new InputStreamReader(client.getInputStream()));
dan bisa memutar android saya dan menjaga koneksi klien / server aktif, namun memiliki GUI rotate. Menurut manual, disimpanInstanceState akan diinisialisasi ketika aktivitas terakhir dimatikan.apa yang saya lakukan...
di manifes, ke bagian aktivitas, menambahkan:
dalam kode untuk aktivitas, diterapkan:
sumber
Apa yang Anda gambarkan adalah perilaku default. Anda harus mendeteksi dan menangani sendiri acara ini dengan menambahkan:
ke manifes Anda dan kemudian perubahan yang ingin Anda tangani. Jadi untuk orientasi, Anda akan menggunakan:
dan untuk keyboard yang dibuka atau ditutup Anda akan menggunakan:
Jika Anda ingin menangani keduanya, Anda bisa memisahkannya dengan perintah pipa seperti:
Ini akan memicu metode onConfigurationChanged dalam Kegiatan apa pun yang Anda panggil. Jika Anda mengganti metode, Anda bisa meneruskan nilai-nilai baru.
Semoga ini membantu.
sumber
Saya baru saja menemukan pengetahuan ini:
Untuk menjaga agar Kegiatan tetap hidup melalui perubahan orientasi, dan menanganinya
onConfigurationChanged
, dokumentasi dan contoh kode di atas menyarankan ini dalam file Manifest:yang memiliki manfaat ekstra yang selalu berhasil.
Pengetahuan bonusnya adalah bahwa menghilangkan yang
keyboardHidden
tampak logis, tetapi menyebabkan kegagalan dalam emulator (setidaknya untuk Android 2.1): menetapkan hanyaorientation
akan membuat panggilan emulator baikOnCreate
danonConfigurationChanged
kadang - kadang, dan hanya diOnCreate
waktu lain.Saya belum melihat kegagalan pada perangkat, tetapi saya telah mendengar tentang kegagalan emulator untuk yang lain. Jadi, ini layak untuk didokumentasikan.
sumber
Fragments
dansetRetainInstance
sebagai gantinya.Anda mungkin juga mempertimbangkan untuk menggunakan cara platform Android untuk mempertahankan data di seluruh perubahan orientasi:
onRetainNonConfigurationInstance()
dangetLastNonConfigurationInstance()
.Ini memungkinkan Anda untuk mempertahankan data di seluruh perubahan konfigurasi, seperti informasi yang mungkin Anda peroleh dari server yang diambil atau sesuatu yang telah dihitung
onCreate
atau sejak saat itu, sementara itu juga memungkinkan Android untuk menata ulang AndaActivity
menggunakan file xml untuk orientasi yang sekarang digunakan .Lihat di sini atau di sini .
Perlu dicatat bahwa metode ini sekarang sudah usang (walaupun masih lebih fleksibel daripada menangani perubahan orientasi sendiri seperti kebanyakan solusi di atas sarankan) dengan rekomendasi bahwa setiap orang beralih ke
Fragments
dan alih-alih menggunakansetRetainInstance(true)
pada setiapFragment
yang ingin Anda pertahankan.sumber
Pendekatan ini bermanfaat tetapi tidak lengkap saat menggunakan Fragmen.
Fragmen biasanya dibuat ulang pada perubahan konfigurasi. Jika Anda tidak ingin ini terjadi, gunakan
setRetainInstance(true);
dalam konstruktor FragmenIni akan menyebabkan fragmen dipertahankan selama perubahan konfigurasi.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
sumber
setRetainInstance()
metode @Abdo yang disebutkan.Saya hanya menambahkan
dalam file manifes dan tidak menambahkan
onConfigurationChanged
metode apa pun dalam aktivitas saya.Jadi setiap kali keyboard meluncur keluar atau tidak terjadi apa-apa .
sumber
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
dan itu berfungsi. Pengaturan saya di build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
The
onCreate
Metode ini masih disebut bahkan ketika Anda mengubahorientation
android. Jadi memindahkan semua fungsi berat ke metode ini tidak akan membantu Andasumber
Masukkan kode di bawah ini ke dalam
<activity>
tag Anda diManifest.xml
:sumber
Apa bagian dari manifes yang mengatakan "jangan panggil
onCreate()
"?Juga, dokumen Google mengatakan untuk menghindari penggunaan
android:configChanges
(kecuali sebagai upaya terakhir) .... Tapi kemudian metode alternatif yang mereka sarankan semua DO gunakanandroid:configChanges
.Sudah pengalaman saya bahwa emulator SELALU memanggil
onCreate()
rotasi.Tapi perangkat 1-2 yang saya jalankan kode yang sama ... tidak. (Tidak yakin mengapa akan ada perbedaan.)
sumber
Sangat sederhana lakukan saja langkah-langkah berikut ini:
Ini bekerja untuk saya:
Catatan: orientasi tergantung pada penggantian Anda
sumber
Perubahan yang harus dilakukan dalam manifes Android adalah:
Tambahan yang harus dilakukan di dalam aktivitas adalah:
sumber
Tambahkan baris ini ke manifes Anda: -
dan cuplikan ini ke aktivitas: -
sumber
Ada beberapa cara untuk melakukan ini:
Simpan Status Aktivitas
Anda dapat menyimpan status aktivitas di
onSaveInstanceState
.dan kemudian gunakan
bundle
untuk memulihkan keadaan.Tangani perubahan orientasi sendiri
Alternatif lain adalah menangani perubahan orientasi sendiri. Tetapi ini tidak dianggap sebagai praktik yang baik.
Tambahkan ini ke file manifes Anda.
untuk Android 3.2 dan yang lebih baru:
Batasi rotasi
Anda juga dapat membatasi aktivitas Anda ke mode potret atau lansekap untuk menghindari rotasi.
Tambahkan ini ke tag aktivitas di file manifes Anda:
Atau laksanakan ini secara terprogram dalam aktivitas Anda:
sumber
Cara yang saya temukan untuk melakukan ini adalah menggunakan
onRestoreInstanceState
danonSaveInstanceState
peristiwa untuk menyimpan sesuatu diBundle
(bahkan jika Anda tidak memerlukan variabel disimpan, cukup masukkan sesuatu di sana sehinggaBundle
tidak kosong). Kemudian, padaonCreate
metode, periksa untuk melihat apakahBundle
kosong, dan jika ya, maka lakukan inisialisasi, jika tidak, maka lakukanlah.sumber
Meskipun itu bukan "cara Android", saya mendapatkan hasil yang sangat baik dengan menangani perubahan orientasi sendiri dan hanya memposisikan ulang widget dalam tampilan untuk mempertimbangkan orientasi yang diubah. Ini lebih cepat daripada pendekatan lain, karena pandangan Anda tidak harus disimpan dan dipulihkan. Ini juga memberikan pengalaman yang lebih mulus bagi pengguna, karena widget yang diposisikan ulang adalah widget yang sama persis, hanya dipindahkan dan / atau diubah ukurannya. Tidak hanya status model, tetapi juga status tampilan, dapat dipertahankan dengan cara ini.
RelativeLayout
terkadang bisa menjadi pilihan yang baik untuk tampilan yang harus mengubah arah dari waktu ke waktu. Anda hanya menyediakan satu set params tata letak potret dan satu set params tata letak lanskap, dengan aturan posisi relatif yang berbeda pada masing-masing, untuk setiap widget anak. Kemudian, dalamonConfigurationChanged()
metode Anda, Anda memberikan yang sesuai untuksetLayoutParams()
panggilan pada setiap anak. Jika kontrol anak mana pun itu sendiri perlu diorientasi ulang secara internal , Anda cukup memanggil metode pada anak itu untuk melakukan reorientasi. Anak itu sama panggilan metode pada salah satu nya kontrol anak yang perlu reorientasi internal dan sebagainya.sumber
Setiap kali ketika layar diputar, aktivitas yang dibuka selesai dan onCreate () dipanggil lagi.
1. Anda dapat melakukan satu hal, menyimpan status aktivitas saat layar diputar sehingga, Anda dapat memulihkan semua hal lama saat aktivitas onCreate () dipanggil lagi. Lihat ini tautan
2. Jika Anda ingin mencegah memulai kembali aktivitas, cukup tempatkan baris berikut di file manifest.xml Anda.
sumber
Anda perlu menggunakan metode onSavedInstanceState untuk menyimpan semua nilai ke parameternya yaitu bundle
dan gunakan
untuk retrive dan mengatur nilai untuk melihat objek itu akan menangani rotasi layar
sumber
Catatan: Saya memposting jawaban ini jika seseorang di masa depan menghadapi masalah yang sama dengan saya. Bagi saya, baris berikut tidak cukup:
Ketika saya memutar layar, metode `onConfigurationChanged (Configuration newConfig) tidak dipanggil.
Solusi: Saya juga harus menambahkan "screenSize" bahkan jika masalahnya ada hubungannya dengan orientasi. Jadi di file AndroidManifest.xml -, tambahkan ini:
Kemudian implementasikan metode tersebut
onConfigurationChanged(Configuration newConfig)
sumber
Di bagian aktivitas
manifest
, tambahkan:sumber
Tambahkan baris ini dalam manifes:
android:configChanges="orientation|screenSize"
sumber
Orang-orang mengatakan bahwa Anda harus menggunakannya
Tetapi cara terbaik dan paling profesional untuk menangani rotasi di Android adalah dengan menggunakan kelas Loader. Ini bukan kelas yang terkenal (saya tidak tahu mengapa), tetapi ini jauh lebih baik daripada AsyncTask. Untuk informasi lebih lanjut, Anda dapat membaca tutorial Android yang ada di kursus Android Udacity.
Tentu saja, sebagai cara lain, Anda bisa menyimpan nilai atau tampilan dengan onSaveInstanceState dan membacanya dengan onRestoreInstanceState. Terserah Anda kok.
sumber
Setelah beberapa saat coba-coba, saya menemukan solusi yang sesuai dengan kebutuhan saya dalam sebagian besar situasi. Ini Kodenya:
Konfigurasi manifes:
Aktifitas utama:
Dan sampel Fragmen:
Dapat ditemukan di github .
sumber
Gunakan
orientation
pendengar untuk melakukan tugas yang berbeda pada orientasi yang berbeda.sumber
Masukkan kode di bawah ini ke
Activity
dalamAndroid Manifest
.Ini tidak akan memulai kembali aktivitas Anda ketika Anda akan mengubah orientasi.
sumber
Perbaiki orientasi layar (lanskap atau potret) di
AndroidManifest.xml
android:screenOrientation="portrait"
atauandroid:screenOrientation="landscape"
untuk ini
onResume()
metode Anda tidak dipanggil.sumber
Salah satu komponen terbaik dari arsitektur Android yang diperkenalkan oleh Google akan memenuhi semua persyaratan Anda yaitu ViewModel.
Itu dirancang untuk menyimpan dan mengelola data terkait UI dengan cara siklus hidup plus yang akan memungkinkan data untuk bertahan saat layar berputar
Silakan lihat ini: https://developer.android.com/topic/libraries/architecture/viewmodel
sumber
Anda dapat menggunakan objek ViewModel dalam aktivitas Anda.
Objek ViewModel secara otomatis dipertahankan selama perubahan konfigurasi sehingga data yang dimilikinya segera tersedia untuk aktivitas atau contoh fragmen berikutnya. Baca lebih banyak:
https://developer.android.com/topic/libraries/architecture/viewmodel
sumber