Apa cara terbaik untuk mencegah klik dua kali pada tombol di Android?
android
android-button
double-click
Androider
sumber
sumber
Jawaban:
Nonaktifkan tombol dengan
setEnabled(false)
sampai aman bagi pengguna untuk mengkliknya lagi.sumber
menghemat waktu klik terakhir saat mengklik akan mencegah masalah ini.
yaitu
sumber
Solusi saya adalah
Penggunaannya mirip dengan OnClickListener tetapi menimpa onSingleClick () sebagai gantinya:
sumber
Menonaktifkan tombol atau pengaturan yang tidak dapat diklik tidak cukup jika Anda melakukan pekerjaan yang intensif secara komputasional di onClick () karena acara klik dapat menjadi antri sebelum tombol dapat dinonaktifkan. Saya menulis kelas dasar abstrak yang mengimplementasikan OnClickListener yang Anda bisa menimpanya, yang memperbaiki masalah ini dengan mengabaikan klik yang antri:
Penggunaannya sama dengan OnClickListener tetapi menimpa OnOneClick () sebagai gantinya:
sumber
Anda dapat melakukannya dengan sangat mewah dengan Fungsi Ekstensi Kotlin dan RxBinding
atau
dan kemudian:
sumber
Saya juga menjalankan dalam masalah yang sama, saya menampilkan beberapa datepicker & timepickers di mana kadang-kadang mendapat klik 2 kali. Saya telah menyelesaikannya dengan ini
Anda dapat mengubah waktu tergantung pada kebutuhan Anda. Metode ini bekerja untuk saya.
sumber
setEnabled(false)
bekerja dengan baik untuk saya.Idenya adalah saya menulis
{ setEnabled(true); }
di awal dan membuatnyafalse
di klik pertama tombol.sumber
Saya tahu ini adalah pertanyaan lama, tetapi saya membagikan solusi terbaik yang saya temukan untuk menyelesaikan masalah umum ini
Dan di file lain, seperti Utils.java
sumber
Solusi aktual untuk masalah ini adalah dengan menggunakan setEnabled (false) yang menghilangkan tombol, dan setClickable (false) yang membuatnya jadi klik kedua tidak dapat diterima. Saya telah menguji ini dan tampaknya sangat efektif.
sumber
Jika seseorang masih mencari jawaban singkat, Anda dapat menggunakan kode di bawah ini
Kode ini akan masuk ke dalam
if statement
setiap kali pengguna mengklikView within 1 second
dan kemudianreturn;
akan dimulai dan kode lebih lanjut tidak akan memulai.sumber
Cara idiomatis K TERTINGGI Kotlin :
Pemakaian:
sumber
Solusi saya adalah mencoba menggunakan
boolean
variabel:Dan menggunakan seperti di bawah ini:
PEMBARUAN : Solusi Kotlin, menggunakan ekstensi tampilan
sumber
Click Guard bekerja dengan baik dengan Butter Knife
sumber
dalam situasi saya, saya menggunakan tampilan tombol dan itu mengambil klik terlalu cepat. cukup nonaktifkan yang dapat diklik dan aktifkan lagi setelah beberapa detik ...
Pada dasarnya saya membuat kelas pembungkus yang membungkus Views onClickListener Anda. Anda juga dapat mengatur penundaan khusus jika Anda mau.
dan untuk menyebutnya cukup lakukan ini:
atau berikan penundaan Anda sendiri:
UPDATE: Di atas cara mode lama sedikit sekarang bahwa RxJava sangat lazim. seperti yang orang lain katakan, di android kita bisa menggunakan throttle untuk memperlambat klik. di sini adalah satu contoh:
Anda dapat menggunakan perpustakaan ini untuk itu:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
sumber
sumber
Anda dapat menggunakan metode ini. Dengan menggunakan post delay Anda dapat menangani acara klik ganda.
batal debounceEffectForClick (Tampilan tampilan) {
sumber
Ekstensi Kotlin yang memungkinkan kode inline singkat & waktu tunggu klik ganda variabel
Pemakaian:
Atau
sumber
Kode di bawah ini akan mencegah pengguna mengklik beberapa kali dalam sepersekian detik dan hanya mengizinkan setelah 3 detik.
sumber
Tampaknya menyetel pendengar klik Anda di onResume dan menghapusnya di onPause juga berfungsi.
sumber
Bagi saya hanya mengingat cap waktu dan mengeceknya (yang lebih dari 1 detik berlalu sejak klik sebelumnya) membantu.
sumber
Saya harap ini dapat membantu ANDA, memasukkan kode Anda event handler.
// ------------------------------------------------ --------------------------------
sumber
Saya menemukan tidak ada saran ini yang berfungsi jika metode onClick tidak segera kembali. Acara sentuh antri oleh Android dan onClick berikutnya dipanggil hanya setelah yang pertama selesai. (Karena ini dilakukan pada satu UI thread ini benar-benar normal.) Saya perlu menggunakan waktu ketika fungsi onClick selesai + satu variabel boolean untuk menandai apakah onClick yang diberikan sedang berjalan. Kedua atribut marker ini bersifat statis untuk menghindari onClickListener untuk berjalan secara bersamaan. (Jika pengguna mengklik tombol lain) Anda dapat dengan mudah mengganti OnClickListener Anda ke kelas ini dan alih-alih menerapkan metode onClick Anda perlu menerapkan metode abstrak oneClick ().
sumber
Anda juga dapat menggunakan rx bindings dengan jake wharton untuk mencapai ini. berikut adalah contoh yang mengisi 2 detik antara klik berurutan:
// note: abaikan Object v dalam hal ini dan saya pikir selalu.
sumber
sumber
Menambahkan ke jawaban Jim kode dapat dibuat lebih ringkas:
Pemakaian:
sumber
Di kotlin
sumber
Pengaturan Clickable to false tidak berfungsi pada klik ganda pertama tetapi klik ganda berikutnya diblokir. Seolah-olah delegasi klik pemuatan pertama kali lebih lambat dan klik kedua ditangkap sebelum yang pertama selesai.
sumber
Saya memperbaiki masalah ini menggunakan dua klausa, satu mirip dengan jawaban @ jinshiyi11 dan anoter didasarkan pada klik eksplisit, dalam hal ini Anda dapat mengklik tombol hanya sekali saja, jika Anda ingin klik lain Anda harus menunjukkannya secara eksplisit .
Contoh penggunaan:
sumber
sumber
AtomicBoolean
tidak bisa membantu.Coba ini, ini berfungsi:
sumber