Apa cara yang tepat untuk mengimplementasikan antarmuka OnClickListener untuk banyak tombol


10

Aktivitas Android saya berisi beberapa tombol yang semuanya memerlukan OnClickListener. Saya telah melihat banyak cara berbeda untuk melakukan ini seperti ::

  • Menerapkan antarmuka di kelas aktivitas
  • Membuat kelas terpisah yang mengimplementasikan antarmuka
  • Menentukan kelas dalam anonim untuk setiap tombol.

Saya telah melihat banyak contoh dari setiap pendekatan. Namun, tidak jelas bagi saya mengapa satu pendekatan akan digunakan, bukan yang lain. Apakah perbedaan antara pendekatan ini bergaya atau apakah ada alasan yang membuat satu pendekatan lebih baik?

Jawaban:


6

Seperti banyak hal, pendekatan yang benar tergantung pada apa yang Anda coba lakukan untuk tombol tertentu dan apa lagi yang Anda lakukan dengan aktivitas tersebut.

Kelas aktivitas mengimplementasikan antarmuka :
Ini adalah opsi yang baik ketika Anda hanya memiliki satu jenis tugas untuk dieksekusi ketika pendengar ini dipanggil. Contohnya adalah formulir sederhana dengan sejumlah bidang dan tombol simpan. Saya lebih suka untuk tidak meminta pendengar acara saya memeriksa sumber acara untuk memutuskan apa yang sebenarnya perlu dilakukan. Saya tahu bahwa beberapa orang mungkin mengatakan ini adalah hal gaya, tetapi saya percaya bahwa dengan tidak mengharuskan pendengar untuk melakukan pemeriksaan ini membuat kode lebih mudah diikuti karena Anda akan tahu persis apa yang dipanggil untuk setiap acara.

Kelas yang berbeda mengimplementasikan antarmuka :
Seperti yang saya katakan di atas, saya lebih suka opsi ini ketika saya memiliki beberapa item yang dapat menjalankan acara yang sama. Memperluas contoh di atas, mari tambahkan tombol yang jelas yang juga membutuhkan pendengar klik. Buat satu pendengar yang melakukan tindakan simpan sebelumnya dan yang melakukan tindakan hapus terlebih dahulu. Setiap pendengar hanya ditambahkan ke komponen yang akan menghasilkan tindakan itu.

Implementasi ini memiliki manfaat tambahan yang dapat Anda manfaatkan jika Anda peduli. Manfaatnya adalah mencegah kelas lain memicu peristiwa di dalam kelas aktivitas Anda. Karena metode antarmuka harus bersifat publik, siapa pun yang memiliki referensi ke kelas dapat memecat acara. Jika Anda ingin kontrol yang jelas atas siapa yang dapat melakukan apa dalam aplikasi, kelas yang terpisah mencegah siapa pun dengan referensi ke aktivitas untuk memicu formulir Anda dihapus atau disimpan (atau berpotensi melanggar kode jika pendengar menggunakan sumber, tetapi tidak tidak menangani input yang buruk).

Kelas dalam anonim mengimplementasikan antarmuka :
Ini benar-benar hanya cara khusus untuk membangun opsi kedua menggunakan kelas yang berbeda sebagai implementasinya. Opsi ini bahkan dapat membatasi siapa yang memiliki akses untuk memicu acara karena tidak ada orang lain yang dapat membuat instance kelas. Namun, saya pikir faktor yang lebih penting antara kedua opsi tersebut adalah seberapa banyak pekerjaan yang sedang dilakukan. Menghapus beberapa bidang teks adalah operasi yang sederhana dan lurus ke depan. Namun, proses menyimpan untuk dapat melibatkan sejumlah tugas adalah Anda memvalidasi input (yang seharusnya Anda lakukan), menulis ke database untuk menyimpan nilai-nilai dan memicu beberapa tindakan pasca penyimpanan. Dalam hal ini, membuat kelas terpisah dengan file sendiri akan memberikan pembagian yang lebih jelas antara formulir input dan pemrosesan data. Ini pada gilirannya membuat kode formulir bukan file yang lebih besar dengan beberapa kelas dalam bersarang di dalamnya.


Wow, terima kasih atas tanggapan Anda. Dalam hal overhead, apakah lebih mahal untuk membuat beberapa kelas pendengar?
slayton

@layton: Akan selalu ada biaya apa pun yang Anda lakukan. Pertanyaannya seharusnya "Apakah perbedaan itu penting bagi Anda?" Ada beban untuk membuat lebih banyak objek, tetapi waktu eksekusi akan lebih lama jika pendengar Anda harus melalui daftar sumber untuk memutuskan apa yang harus dilakukan. Jika penggunaan dan kinerja memori penting bagi Anda, maka Anda harus membuat profil kode dan memutuskan apa yang terbaik berdasarkan kebutuhan Anda. Namun, saya akan ragu bahwa ini akan menjadi leher botol kode Anda. Sampai diperlihatkan sebaliknya, buat keputusan Anda yang membuat kode lebih jelas dan lebih terorganisir.
unholysampler

3

Cara keempat adalah mengatur atribut onClick di tata letak:

<Button android:onClick="clickHandlerForButtonX" />

yang memiliki metode terkait ini dalam Aktivitas:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

menarik, saya tidak sadar Anda bisa melakukan itu. Meskipun ini tampaknya menjadi mekanisme spesifik Android untuk menangani klik tombol.
slayton

Saya biasanya pergi dengan "Aktivitas kelas mengimplementasikan antarmuka", meskipun - dengan begitu, Anda memiliki semua hal terkait klik di tempat yang sama.
orjan

metode khusus ini tidak bekerja dengan fragmen.
Rahul Tiwari
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.