Android onClick dalam XML vs. OnClickListener

87

Saya menyadari bahwa pertanyaan dengan kata-kata serupa telah ditanyakan sebelumnya, tetapi ini berbeda. Saya cukup baru dalam mengembangkan aplikasi Android dan saya memiliki tiga pertanyaan mengenai perbedaan antara android:onclick=""atribut XML dan setOnClickListenermetode.

  1. Apa perbedaan diantara keduanya? Apakah perbedaan antara kedua implementasi ditemukan pada waktu kompilasi atau waktu proses atau keduanya?

  2. Kasus penggunaan apa yang menguntungkan untuk implementasi mana?

  3. Perbedaan apa yang dibuat oleh penggunaan fragmen di Android dalam pilihan implementasi?

KG6ZVP
sumber
2
Untuk # 2: Anda harus berhati-hati saat menggunakan xml onclickkarena Anda perlu memastikan bahwa setiap kelas mengimplementasikan metode itu. Ini mengasumsikan bahwa Anda menggunakan tata letak lebih dari sekali. Namun, jika Anda memiliki antarmuka java untuk memastikan metode tersebut ada di semua kelas yang menerapkannya, Anda tidak perlu khawatir.
Uxonith
Bukankah memiliki antarmuka java seperti yang Anda gambarkan hampir sama dengan memperluas atau menerapkan OnClickListener?
KG6ZVP
Saya telah melihat ini sebelumnya dan saya pikir ada sedikit lebih banyak daripada preferensi, tapi maaf saya tidak bisa mengatakan lebih banyak karena sudah lama. Saya suka android:onclickwaktu yang nyaman, tetapi saya tahu bahwa terkadang hal itu menyebabkan masalah, dan saya juga tidak dapat mengingatnya :)
Uxonith
xml onClick tidak berfungsi untuk elemen tata letak bersarang yang meningkat secara dinamis di API level 19
Amit Kaushik
1
Saya jarang melihat kode dari orang lain yang mengimplementasikan android: onClick dan ini adalah yang paling membingungkan ketika Anda melihat kode orang lain. Karena tidak semua kemungkinan setOnClickListener hampir semua orang hanya menggunakan setOnClickListener menurut pendapat saya
Christian

Jawaban:

124

Perbedaan Antara OnClickListener vs OnClick:

  • OnClickListener adalah antarmuka yang perlu Anda terapkan dan dapat disetel ke tampilan dalam kode java.
  • OnClickListener adalah apa yang menunggu seseorang untuk benar-benar mengeklik, onclick menentukan apa yang terjadi ketika seseorang mengeklik.
  • Akhir-akhir ini android menambahkan atribut xml ke tampilan yang disebut android: onclick, yang bisa digunakan untuk menangani klik secara langsung di aktivitas tampilan tanpa perlu mengimplementasikan antarmuka apa pun.
  • Anda dapat dengan mudah menukar satu implementasi listener dengan yang lain jika perlu.
  • OnClickListener memungkinkan Anda memisahkan tindakan / perilaku peristiwa klik dari Tampilan yang memicu peristiwa tersebut. Sementara untuk kasus sederhana, ini bukan masalah besar, untuk penanganan acara yang kompleks, ini berarti kode dapat dibaca dan dipelihara dengan lebih baik.
  • Karena OnClickListener adalah antarmuka, kelas yang mengimplementasikannya memiliki fleksibilitas dalam menentukan variabel instance dan metode yang diperlukannya untuk menangani acara tersebut. Sekali lagi, ini bukan masalah besar dalam kasus sederhana, tetapi untuk kasus kompleks, kami tidak ingin mencampuradukkan variabel / metode yang terkait dengan penanganan peristiwa dengan kode View yang memicu peristiwa tersebut.
  • OnClick dengan pengikatan fungsi di XML Layout adalah pengikatan antara onClick dan fungsi yang akan dipanggilnya. Fungsi tersebut harus memiliki satu argumen (Tampilan) agar onClick berfungsi.

Keduanya berfungsi dengan cara yang sama, hanya yang satu diatur melalui kode java dan yang lainnya melalui kode xml.

Penerapan Kode setOnClickListener:

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

Implementasi XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

Performa:

Keduanya sama dalam performa. Xml telah diurai menjadi kode biner saat kompilasi. jadi tidak ada kelebihan dalam Xml.

Keterbatasan:

android: onClick adalah untuk API level 4 dan seterusnya, jadi jika Anda menargetkan <1.6, Anda tidak dapat menggunakannya.

Jebasuthan
sumber
`Xml diurai menjadi kode biner saat mengkompilasi` Apa arti sebenarnya dari pernyataan ini? Karena saya telah melihat kode dex dari apk yang memiliki android: onClick dalam file manifesnya, tetapi saya tidak menemukan kode apa pun yang secara eksplisit mengatur pendengar
VicX
penjelasan yang luar biasa. +1
Zia Ur Rahman
1
Sebenarnya, ada beberapa overhead dalam XML . Saat tombol diklik untuk pertama kali, refleksi digunakan untuk menentukan metode yang harus dipanggil . Namun, ini mungkin dapat diabaikan untuk sebagian besar kasus penggunaan (dan pengoptimalan prematur adalah akar dari semua kejahatan).
Yoel
22

Saya terkejut tidak ada yang membicarakan hal ini, tetapi berhati-hatilah, meskipun android:onClickXML tampaknya menjadi cara yang nyaman untuk menangani klik, setOnClickListenerpenerapannya melakukan sesuatu selain menambahkan onClickListener. Memang, itu membuat view property clickablemenjadi true.

Meskipun ini mungkin tidak menjadi masalah pada sebagian besar implementasi Android, menurut konstruktor ponsel, tombol selalu default ke clickable = true tetapi konstruktor lain pada beberapa model ponsel mungkin memiliki clickable = false default pada tampilan non Tombol.

Jadi pengaturan XML saja tidak cukup, Anda harus berpikir sepanjang waktu untuk menambahkan android:clickable="true"non tombol, dan jika Anda memiliki perangkat di mana defaultnya dapat diklik = true dan Anda lupa sekali pun untuk meletakkan atribut XML ini, Anda tidak akan memperhatikan masalah saat runtime tetapi akan mendapatkan umpan balik di pasar saat itu akan berada di tangan pelanggan Anda!

Selain itu, kami tidak pernah bisa yakin tentang bagaimana proguard akan mengaburkan dan mengganti nama atribut XML dan metode kelas, jadi tidak 100% aman karena mereka tidak akan pernah memiliki bug suatu hari nanti.

Jadi jika Anda tidak pernah ingin mendapat masalah dan tidak pernah memikirkannya, lebih baik gunakan setOnClickListeneratau pustaka seperti ButterKnife dengan anotasi@OnClick(R.id.button)

Livio
sumber
1
Apakah Anda memiliki pengalaman (atau melihat di suatu tempat) bahwa bug terjadi karena kebingungan saat menggunakan android:onClick?
Akram
Terima kasih Pak! Jawaban Anda sangat membantu!
Yi Shen
13

Secara sederhana:

Jika Anda memiliki android:onClick = "someMethod" dalam xml , itu mencari public void someMethoddalam kelas Aktivitas Anda. OnClickListenerdipanggil langsung dari Aktivitas Anda dan ditautkan ke beberapa hal tertentu View. Misalnya someButton.setOnClickListenerdan dalam kode di bawah ini dikatakan apa yang harus dilakukan saat someButtonditekan.

Semoga membantu :)

Marson
sumber
4

Seperti yang dikatakan sebelumnya: keduanya adalah cara untuk menambahkan logika sebagai respons terhadap suatu peristiwa, dalam hal ini peristiwa 'klik'.

Saya akan memisahkan antara logika dan presentasi, seperti yang kita lakukan di dunia HTML / JavaScript: Tinggalkan XML untuk presentasi dan tambahkan pendengar acara melalui kode.

Stephan van Hoof
sumber
1
Setuju, kecuali itu adalah aplikasi yang sangat kecil dengan beberapa perilaku sederhana, semua kode eksekusi Anda harus disimpan terpisah dan terorganisir dengan baik, sebaiknya menggunakan metode terpisah
OzzyTheGiant
0

Jika Anda memiliki beberapa tombol hanya dengan satu metode, saya sarankan melakukannya di java. Tetapi jika Anda memiliki tombol dengan satu metode tertentu, onClick dalam XML akan lebih baik.

Megs
sumber
0

Akan lebih mudah untuk selalu menggunakan atribut android: onClick kecuali Anda memiliki alasan kuat untuk tidak melakukannya, misalnya, jika Anda membuat instance Tombol saat runtime atau Anda perlu mendeklarasikan perilaku klik dalam subkelas Fragmen.

Mustapha Hadid
sumber
3
Saya jarang melihat kode dari orang lain yang mengimplementasikan android: onClick dan ini adalah yang paling membingungkan ketika Anda melihat kode orang lain. Karena tidak semua kemungkinan setOnClickListener hampir semua orang hanya menggunakan setOnClickListener menurut pendapat saya
Christian
0

Ada beberapa alasan mengapa Anda mungkin ingin menyetel secara terprogram OnClickListener. Yang pertama adalah jika Anda ingin mengubah perilaku tombol saat aplikasi Anda berjalan. Anda dapat mengarahkan tombol Anda ke metode lain sepenuhnya, atau cukup nonaktifkan tombol dengan mengatur OnClickListeneryang tidak melakukan apa-apa.

Saat Anda menentukan listener menggunakan onClickatribut, tampilan akan mencari metode dengan nama itu hanya di aktivitas hostnya. Menyetel secara terprogram OnClickListenermemungkinkan Anda mengontrol perilaku tombol dari suatu tempat selain aktivitas hostnya. Ini akan menjadi sangat relevan saat kami menggunakan Fragments, yang pada dasarnya adalah aktivitas mini, memungkinkan Anda membangun koleksi tampilan yang dapat digunakan kembali dengan siklus hidupnya sendiri, yang kemudian dapat dirangkai menjadi aktivitas. Fragmen selalu perlu digunakan OnClickListenersuntuk mengontrol tombolnya, karena itu bukan Aktivitas, dan tidak akan dicari untuk listener yang ditentukan di onClick.

Rohan Vachhani
sumber
-2

Saya pikir perbedaan utama di antara mereka adalah:

OnClick: Saat Anda mengklik tombol dengan jari Anda.

OnClickListner: Ini mungkin pilihan yang lebih luas yang diterapkan dalam berbagai kode.

Misalnya ketika Anda mengetik url "ymail.com", yahoo menemukan nama pengguna dan kata sandi Anda dari browser Anda dan mengaktifkan tombol status klik untuk membuka email Anda. Tindakan ini harus diterapkan hanya di onClickListener.

Ini adalah ideku!

Seyyed Mahmood Ahmadi
sumber
Ini menarik tetapi ada lebih dari itu; Anda seharusnya lebih suka menjadi komentar.
Dakatine