Saya memiliki dialog dengan EditText
untuk input. Ketika saya mengklik tombol "ya" pada dialog, itu akan memvalidasi input dan kemudian menutup dialog. Namun, jika inputnya salah, saya ingin tetap berada di dialog yang sama. Setiap kali apa pun inputnya, dialog harus ditutup secara otomatis ketika saya mengklik tombol "tidak". Bagaimana saya bisa menonaktifkan ini? Omong-omong, saya telah menggunakan PositiveButton dan NegativeButton untuk tombol pada dialog.
android
dialog
android-alertdialog
android-dialog
android-dialogfragment
pengguna304881
sumber
sumber
Berikut adalah beberapa solusi untuk semua jenis dialog termasuk solusi untuk AlertDialog.Builder yang akan bekerja pada semua level API (bekerja di bawah API 8, yang jawaban lain di sini tidak). Ada solusi untuk AlertDialogs menggunakan AlertDialog.Builder, DialogFragment, dan DialogPreference.
Di bawah ini adalah contoh kode yang menunjukkan cara mengganti penangan tombol umum yang umum dan mencegah dialog menutup untuk bentuk dialog yang berbeda ini. Semua contoh menunjukkan bagaimana mencegah tombol positif menutup dialog.
Catatan: Deskripsi tentang cara kerja dialog penutup di bawah tenda untuk kelas android dasar dan mengapa pendekatan berikut dipilih mengikuti contoh-contoh, bagi mereka yang ingin lebih detail
AlertDialog.Builder - Ubah penangan tombol default segera setelah show ()
DialogFragment - override onResume ()
DialogPreference - ganti showDialog ()
Penjelasan pendekatan:
sumber
ProgressDialog
ketika tombol diklik?Solusi alternatif
Saya ingin menyajikan jawaban alternatif dari perspektif UX.
Mengapa Anda ingin mencegah dialog ditutup ketika tombol diklik? Mungkin itu karena Anda memiliki dialog khusus di mana pengguna belum membuat pilihan atau belum sepenuhnya mengisi semuanya. Dan jika mereka belum selesai, maka Anda seharusnya tidak membiarkan mereka mengklik tombol positif sama sekali. Nonaktifkan saja sampai semuanya siap.
Jawaban lain di sini memberikan banyak trik untuk mengganti klik tombol positif. Jika itu penting untuk dilakukan, bukankan Android telah membuat metode yang nyaman untuk melakukannya? Mereka tidak melakukannya.
Sebaliknya, panduan desain Dialogs menunjukkan contoh situasi seperti itu. Tombol OK dinonaktifkan sampai pengguna membuat pilihan. Tidak ada trik utama yang diperlukan sama sekali. Jelas bagi pengguna bahwa sesuatu masih perlu dilakukan sebelum melanjutkan.
Cara menonaktifkan tombol positif
Lihat dokumentasi Android untuk membuat tata letak dialog khusus . Disarankan agar Anda menempatkan
AlertDialog
di dalam aDialogFragment
. Maka yang perlu Anda lakukan adalah mengatur pendengar pada elemen tata letak untuk mengetahui kapan harus mengaktifkan atau menonaktifkan tombol positif.EditText
, maka gunakan TextWatcher .Tombol positif dapat dinonaktifkan seperti ini:
Berikut ini adalah keseluruhan yang bekerja
DialogFragment
dengan tombol positif yang dinonaktifkan seperti yang dapat digunakan pada gambar di atas.Dialog khusus dapat dijalankan dari aktivitas seperti ini:
Catatan
Tombol masih
null
dionCreateDialog
jadi saya menonaktifkannyaonResume
. Ini memiliki efek yang tidak diinginkan untuk menonaktifkannya lagi jika pengguna beralih ke aplikasi lain dan kemudian kembali tanpa mengabaikan dialog. Ini dapat diatasi dengan juga membatalkan pilihan pengguna atau dengan memanggilRunnable
darionCreateDialog
untuk menonaktifkan tombol pada putaran berikutnya.Terkait
sumber
Saya telah menulis sebuah kelas sederhana (AlertDialogBuilder) yang dapat Anda gunakan untuk menonaktifkan fitur auto-dismiss ketika menekan tombol dialog.
Ini kompatibel juga dengan Android 1.6, sehingga tidak menggunakan OnShowListener (yang hanya tersedia API> = 8).
Jadi, alih-alih menggunakan AlertDialog.Builder Anda dapat menggunakan CustomAlertDialogBuilder ini. Bagian terpenting adalah Anda tidak boleh memanggil create () , tetapi hanya metode show () . Saya telah menambahkan metode seperti setCanceledOnTouchOutside () dan setOnDismissListener sehingga Anda masih dapat mengaturnya langsung di builder.
Saya mengujinya di Android 1.6, 2.x, 3.x dan 4.x jadi itu seharusnya bekerja dengan cukup baik. Jika Anda menemukan beberapa masalah, silakan komentar di sini.
EDIT Berikut adalah contoh kecil tentang cara menggunakan CustomAlertDialogBuilder:
Bersulang,
Yuvi
sumber
Context mContext
dan setel di konstruktor sebagai gantinya.Ini ada sesuatu jika Anda menggunakan
DialogFragment
- yang merupakan cara yang disarankan untuk menangani Dialog.Apa yang terjadi dengan
setButton()
metode AlertDialog (dan saya bayangkan hal yang sama denganAlertDialogBuilder
'ssetPositiveButton()
dansetNegativeButton()
) adalah bahwa tombol yang Anda atur (misalnyaAlertDialog.BUTTON_POSITIVE
) dengan itu akan benar-benar memicu DUAOnClickListener
objek berbeda ketika ditekan.Pertama makhluk DialogInterface.OnClickListener , yang merupakan parameter untuk
setButton()
,setPositiveButton()
, dansetNegativeButton()
.Yang lainnya adalah View.OnClickListener , yang akan diatur untuk secara otomatis mengabaikan Anda
AlertDialog
ketika salah satu tombolnya ditekan - dan diatur denganAlertDialog
sendirinya.Apa yang dapat Anda lakukan adalah dengan menggunakan
setButton()
dengannull
sebagaiDialogInterface.OnClickListener
, untuk membuat tombol, dan kemudian memanggil kustom Anda metode tindakan dalamView.OnClickListener
. Sebagai contoh,Kemudian, Anda dapat mengganti tombol
AlertDialog
' default 'View.OnClickListener
(yang akan mengabaikan dialog) dalam metodeDialogFragment
'onResume()
:Anda perlu mengatur ini dalam
onResume()
metode karenagetButton()
akan kembalinull
sampai setelah dialog ditampilkan!Ini akan menyebabkan metode tindakan khusus Anda hanya dipanggil sekali, dan dialog tidak akan diabaikan secara default.
sumber
Terinspirasi oleh jawaban Tom, saya yakin idenya di sini adalah:
onClickListener
selama pembuatan dialognull
onClickListener
setelah dialog ditampilkan.Anda dapat menimpa
onShowListener
Tom seperti itu. Atau, Anda bisashow()
onClickListener
sebagai berikut (saya pikir sedikit lebih mudah dibaca).Kode:
sumber
Untuk pra API 8 saya memecahkan masalah menggunakan bendera boolean, pendengar pemberhentian dan panggilan dialog.show lagi jika dalam kasus konten editText tidak benar. Seperti ini:
sumber
Jawaban di tautan ini adalah solusi sederhana, dan yang kompatibel segera kembali ke API 3. Sangat mirip dengan solusi Tom Bollwitt, tetapi tanpa menggunakan OnShowListener yang kurang kompatibel.
Saya membuat sedikit adaptasi terhadap kode Kamen karena saya sedang memperpanjang EditTextPreference.
Sangat menyenangkan!
sumber
Kode ini akan bekerja untuk Anda, karena saya punya masalah yang sama dan ini bekerja untuk saya. :)
1- Metode Override Onstart () di kelas dialog-fragmen Anda.
sumber
Untuk ProgressDialogs
Untuk mencegah dialog ditolak secara otomatis, Anda harus mengatur
OnClickListener
setelahProgressDialog
ditampilkan, seperti:sumber
sumber
Anda dapat menambahkan builder.show (); setelah pesan validasi sebelum kembali;
seperti ini
sumber
Untuk mencegah kotak Dialog dari menutup ketika diklik dan itu hanya akan ditutup ketika internet tersedia
Saya mencoba melakukan hal yang sama, karena saya tidak ingin kotak dialog ditutup sampai dan kecuali internet terhubung.
Ini kode saya:
Dan inilah kode manajer Konektivitas saya:
sumber
The specified child already has a parent. You must call removeView() on the child's parent first
Jika Anda menggunakan
material design
saya akan menyarankan memeriksa bahan-dialog . Ini memperbaiki beberapa masalah bagi saya terkait dengan bug Android yang saat ini terbuka (lihat 78088 ), tetapi yang paling penting untuk tiket ini memilikiautoDismiss
bendera yang dapat diatur ketika menggunakanBuilder
.sumber
Gunakan tata letak khusus untuk Anda
DialogFragment
dan tambahkanLinearLayout
konten Anda di bawah yang dapat ditata sebagai tanpa batas agar sesuai dengan Desain Bahan Google. Kemudian cari tombol yang baru dibuat dan gantiOnClickListener
.Contoh:
dialog_add_topic.xml :
Ini adalah hasil akhir.
sumber
Itu bisa dibangun dengan cara termudah:
Dialog Peringatan dengan Tampilan Kustom dan dengan dua Tombol (Positif & Negatif).
CustomClickLister dari Tombol Positif dari Siaga dailog :
Selesai
sumber
Ini mungkin balasan yang sangat terlambat, tetapi menggunakan setCancelable akan membantu.
sumber