Saya mencoba untuk mencegah dialog yang dibuat dengan Pembuat peringatan ditutup saat Aktivitas dimulai ulang.
Jika saya membebani metode onConfigurationChanged, saya berhasil melakukan ini dan mengatur ulang tata letak ke orientasi yang benar tetapi saya kehilangan fitur teks tempel dari teks editan. Jadi dalam memecahkan masalah dialog saya telah membuat masalah teks edit ini.
Jika saya menyimpan string dari teks editan dan menetapkannya kembali dalam perubahan onCofiguration, mereka tampaknya masih default ke nilai awal bukan apa yang dimasukkan sebelum rotasi. Bahkan jika saya memaksa pembatalan tampaknya memperbaruinya.
Saya benar-benar perlu menyelesaikan masalah dialog atau masalah teks edit.
Terima kasih untuk bantuannya.
Jawaban:
Cara terbaik untuk menghindari masalah ini saat ini adalah dengan menggunakan a
DialogFragment
.Buat kelas baru yang diperluas
DialogFragment
. GantionCreateDialog
dan kembalikan file lamaDialog
atau fileAlertDialog
.Kemudian Anda bisa menunjukkannya dengan
DialogFragment.show(fragmentManager, tag)
.Berikut adalah contoh dengan
Listener
:Dan dalam Aktivitas yang Anda panggil:
Jawaban ini membantu menjelaskan tiga pertanyaan lainnya (dan jawabannya):
sumber
onAttach
sekarang sudah usang. Apa yang harus dilakukan?onAttach(Context context)
danandroid.support.v4.app.DialogFragment
. TheonAttach
Metode mengambilcontext
alih-alihactivity
sebagai parameter sekarang.YesNoListener
. Lihat jawaban ini .sumber
Context
di dalam tombol dialogOnClickListener
.Jika Anda mengubah tata letak pada perubahan orientasi, saya tidak akan memasukkan
android:configChanges="orientation"
manifes Anda karena Anda tetap membuat ulang tampilan.Simpan status aktivitas Anda saat ini (seperti teks yang dimasukkan, dialog yang ditampilkan, data yang ditampilkan, dll.) Menggunakan metode ini:
Dengan begitu, aktivitas melewati onCreate lagi dan kemudian memanggil metode onRestoreInstanceState tempat Anda bisa menyetel nilai EditText lagi.
Jika Anda ingin menyimpan Objek yang lebih kompleks, Anda dapat menggunakan
Di sini Anda dapat menyimpan objek apa pun dan di onCreate Anda hanya perlu memanggil
getLastNonConfigurationInstance();
untuk mendapatkan Objek tersebut.sumber
OnRetainNonConfigurationInstance()
sekarang tidak lagi digunakan seperti yang dikatakan oleh Dokumen: developer.android.com/reference/android/app/…setRetainInstance(boolean retain)
sebagai gantinya harus digunakan: developer.android.com/reference/android/app/…setRetainInstance
sama sekali berbeda: ini untuk Fragmen dan tidak menjamin Anda bahwa instance akan dipertahankan.Cukup tambahkan android: configChanges = "orientasi" dengan elemen aktivitas Anda di AndroidManifest.xml
Contoh:
sumber
Pendekatan yang sangat mudah adalah membuat dialog dari metode tersebut
onCreateDialog()
(lihat catatan di bawah). Anda menunjukkannyashowDialog()
. Dengan cara ini, Android menangani rotasi untuk Anda dan Anda tidak perlu memanggildismiss()
dalamonPause()
untuk menghindari WindowLeak dan kemudian Anda tidak harus mengembalikan dialog. Dari dokumen:Lihat dokumen Android showDialog () untuk info selengkapnya. Semoga membantu seseorang!
Catatan: Jika menggunakan AlertDialog.Builder, jangan menelepon
show()
darionCreateDialog()
, panggilcreate()
saja. Jika menggunakan ProgressDialog, cukup buat objek, setel parameter yang Anda butuhkan dan kembalikan. Kesimpulannya,show()
di dalamonCreateDialog()
menyebabkan masalah, buat saja instance de Dialog dan kembalikan. Ini seharusnya berhasil! (Saya mengalami masalah saat menggunakan showDialog () dari onCreate () -sebenarnya tidak menampilkan dialog-, tetapi jika Anda menggunakannya di onResume () atau dalam callback listener, dialog berfungsi dengan baik).sumber
AlertDialog.Builder
. Jika Anda menggunakannya di dalamonCreateDialog()
, alih-alih menggunakanshow()
mengembalikan hasilcreate()
. Jika tidak, panggilshow()
dan simpan AlertDialog yang dikembalikan ke dalam atribut Aktivitas dan dionPause()
dismiss()
dalamnya jika ditampilkan untuk menghindari WindowLeak. Semoga membantu!Pertanyaan ini sudah lama dijawab.
Namun ini adalah solusi non-hacky dan sederhana yang saya gunakan untuk diri saya sendiri.
Saya melakukan kelas pembantu ini untuk diri saya sendiri, jadi Anda juga dapat menggunakannya di aplikasi Anda.
Penggunaannya adalah:
Atau
sumber
Anda bisa menggabungkan metode onSave / onRestore Dialog dengan metode onSave / onRestore Aktivitas untuk mempertahankan status Dialog.
Catatan: Metode ini bekerja untuk Dialog "sederhana", seperti menampilkan pesan peringatan. Ini tidak akan mereproduksi konten WebView yang disematkan dalam Dialog. Jika Anda benar-benar ingin mencegah dialog kompleks dari pemecatan selama rotasi, coba metode Chung IW.
sumber
Jelas, pendekatan terbaik adalah dengan menggunakan DialogFragment.
Berikut adalah solusi saya dari kelas pembungkus yang membantu mencegah dialog berbeda ditutup dalam satu Fragmen (atau Aktivitas dengan pemfaktoran ulang kecil). Selain itu, akan membantu untuk menghindari refactoring kode besar-besaran jika karena alasan tertentu ada banyak
AlertDialogs
kode yang tersebar di antara kode dengan sedikit perbedaan di antara mereka dalam hal tindakan, tampilan, atau hal lain.Ketika datang ke Aktivitas, Anda bisa memanggil
getContext()
di dalamonCreateDialog()
, mentransmisikannya keDialogProvider
antarmuka dan meminta dialog tertentumDialogId
. Semua logika untuk menangani fragmen target harus dihapus.Penggunaan dari fragmen:
Anda dapat membaca artikel lengkap di blog saya Bagaimana cara mencegah Dialog ditutup? dan bermain-main dengan kode sumber .
sumber
Tampaknya ini masih menjadi masalah, bahkan saat "melakukan semuanya dengan benar" dan menggunakan
DialogFragment
dll.Ada utas di Google Issue Tracker yang mengklaim bahwa hal itu disebabkan oleh pesan penutupan lama yang tertinggal dalam antrean pesan. Solusi yang disediakan cukup sederhana:
Luar biasa, ini masih dibutuhkan 7 tahun setelah isu itu pertama kali dilaporkan.
sumber
Saya mengalami masalah serupa: saat orientasi layar berubah,
onDismiss
pendengar dialog akan dipanggil meskipun pengguna tidak menutup dialog. Saya dapat mengatasinya dengan menggunakanonCancel
pendengar, yang dipicu saat pengguna menekan tombol kembali dan saat pengguna menyentuh di luar dialog.sumber
Gunakan saja
dan aplikasi akan tahu cara menangani rotasi dan ukuran layar.
sumber