Sebelum Honeycomb (Android 3), setiap Kegiatan terdaftar untuk menangani klik tombol melalui onClick
tag di Layout's XML:
android:onClick="myClickMethod"
Dalam metode itu Anda dapat menggunakan view.getId()
dan pernyataan switch untuk melakukan logika tombol.
Dengan diperkenalkannya Honeycomb, saya memecah Aktivitas ini menjadi Fragmen yang dapat digunakan kembali di banyak Kegiatan yang berbeda. Sebagian besar perilaku tombol adalah Kegiatan independen, dan saya ingin kode berada di dalam file Fragmen tanpa menggunakan metode lama (pra 1.6) mendaftar OnClickListener
untuk setiap tombol.
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
Masalahnya adalah bahwa ketika tata letak saya meningkat itu masih merupakan aktivitas hosting yang menerima klik tombol, bukan Fragmen individu. Apakah ada pendekatan yang baik untuk itu?
- Daftarkan fragmen untuk menerima klik tombol?
- Lewati acara klik dari Aktivitas ke fragmen yang dimilikinya?
android
xml
button
android-fragments
smith324
sumber
sumber
setOnClickListener
danfindViewById
untuk setiap tombol, itu sebabnyaonClick
ditambahkan, untuk membuat semuanya lebih sederhana.Jawaban:
Anda bisa melakukan ini:
Aktivitas:
Pecahan:
Menanggapi @Ameen yang ingin kopling kurang sehingga Fragmen dapat digunakan kembali
Antarmuka:
Aktivitas:
Pecahan:
sumber
Saya lebih suka menggunakan solusi berikut untuk menangani acara onClick. Ini berfungsi untuk Aktivitas dan Fragmen juga.
sumber
Masalahnya saya pikir adalah pandangan masih aktivitas, bukan fragmen. Fragmen tidak memiliki tampilan independen sendiri dan terlampir pada tampilan aktivitas induk. Itulah sebabnya acara berakhir di Aktivitas, bukan fragmen. Sangat disayangkan, tapi saya pikir Anda akan memerlukan beberapa kode untuk membuat ini berfungsi.
Apa yang saya lakukan selama konversi hanyalah menambahkan pendengar klik yang memanggil pengendali acara lama.
contohnya:
sumber
Saya baru-baru ini memecahkan masalah ini tanpa harus menambahkan metode ke Aktivitas konteks atau harus mengimplementasikan OnClickListener. Saya tidak yakin apakah ini merupakan solusi "valid" juga, tetapi ia berfungsi.
Didasarkan pada: https://developer.android.com/tools/data-binding/guide.html#binding_events
Ini dapat dilakukan dengan binding data: Cukup tambahkan instance fragmen Anda sebagai variabel, maka Anda dapat menautkan metode apa pun dengan onClick.
Dan kode tautan fragmen akan menjadi ...
sumber
android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
name
dan tag tidak boleh memiliki awalan. Mungkin ada tata letak Android versi lama yang memang membutuhkannya?type
variable
android:
ButterKnife mungkin merupakan solusi terbaik untuk masalah kekacauan ini. Ia menggunakan prosesor anotasi untuk menghasilkan kode boilerplate "metode lama".
Tetapi metode onClick masih dapat digunakan, dengan inflator khusus.
Cara Penggunaan
Penerapan
sumber
Saya lebih suka menggunakan penanganan klik dalam kode daripada menggunakan
onClick
atribut dalam XML ketika bekerja dengan fragmen.Ini menjadi lebih mudah ketika memigrasi aktivitas Anda ke fragmen. Anda bisa memanggil handler klik (sebelumnya diatur ke
android:onClick
dalam XML) langsung dari setiapcase
blok.Dalam hal menangani klik dalam fragmen, ini terlihat lebih mudah bagi saya daripada
android:onClick
.sumber
Ini adalah cara lain :
1. Buat BaseFragment seperti ini:
2.Gunakan
dari pada
3. Dalam aktivitas Anda:
dan
Semoga ini bisa membantu.
sumber
Dalam kasus penggunaan saya, saya memiliki 50 ImageViews aneh yang saya perlukan untuk menghubungkan ke metode onClick tunggal. Solusi saya adalah untuk mengulangi pandangan di dalam fragmen dan mengatur pendengar onclick yang sama pada masing-masing:
sumber
Ketika saya melihat jawaban mereka sudah tua. Baru-baru ini Google memperkenalkan DataBinding yang jauh lebih mudah ditangani onClick atau penetapan dalam xml Anda.
Ini adalah contoh bagus yang bisa Anda lihat bagaimana menangani ini:
Ada juga tutorial yang sangat bagus tentang DataBinding yang dapat Anda temukan di Sini .
sumber
Anda dapat menetapkan panggilan balik sebagai atribut dari tata letak XML Anda. Artikel Atribut XML Kustom untuk Widget Android Kustom Anda akan menunjukkan kepada Anda bagaimana melakukannya untuk widget khusus. Penghargaan untuk Kevin Dion :)
Saya sedang menyelidiki apakah saya dapat menambahkan atribut gaya ke kelas Fragmen dasar.
Ide dasarnya adalah untuk memiliki fungsionalitas yang sama dengan implementasi Lihat ketika berhadapan dengan panggilan balik onClick.
sumber
Menambahkan ke jawaban Blundell,
Jika Anda memiliki lebih banyak fragmen, dengan banyak onClicks:
Aktivitas:
Dalam Fragmen Anda:
sumber
Jika Anda mendaftar di xml menggunakan android: Onclick = "", panggilan balik akan diberikan ke Aktivitas yang dihormati di bawah konteks mana fragmen Anda berada (getActivity ()). Jika metode seperti itu tidak ditemukan dalam Kegiatan, maka sistem akan mengeluarkan pengecualian.
sumber
Anda mungkin ingin mempertimbangkan untuk menggunakan EventBus untuk acara yang dipisahkan. Anda dapat mendengarkan acara dengan sangat mudah. Anda juga dapat memastikan acara tersebut diterima di utas ui (alih-alih memanggil runOnUiThread .. untuk Anda sendiri untuk setiap langganan acara)
https://github.com/greenrobot/EventBus
dari Github:
sumber
Saya ingin menambahkan jawaban Adjorn Linkz .
Jika Anda membutuhkan beberapa penangan, Anda bisa menggunakan referensi lambda
Kuncinya di sini adalah
handler
tanda tangan metode yang cocok denganView.OnClickListener.onClick
tanda tangan. Dengan cara ini, Anda tidak perluView.OnClickListener
antarmuka.Selain itu, Anda tidak memerlukan pernyataan peralihan.
Sayangnya, metode ini hanya terbatas pada antarmuka yang memerlukan metode tunggal, atau lambda.
sumber
Meskipun saya telah melihat beberapa jawaban yang bagus bergantung pada pengikatan data, saya tidak melihat ada yang sepenuhnya dengan pendekatan itu - dalam arti memungkinkan resolusi fragmen sambil memungkinkan untuk definisi tata letak fragmen-bebas dalam XML.
Sehingga data asumsi mengikat yang diaktifkan, inilah solusi generik saya dapat mengusulkan; Agak panjang tapi pasti berhasil (dengan beberapa peringatan):
Langkah 1: Implementasi OnClick Kustom
Ini akan menjalankan pencarian yang sadar akan fragmen melalui konteks yang terkait dengan tampilan yang disadap (mis. Tombol):
Langkah 2: Aplikasi deklaratif dalam file tata letak
Kemudian, dalam XML sadar data-binding:
Peringatan
FragmentActivity
implementasi berbasis 'modern'sumber
Ini bekerja untuk saya: (Android studio)
sumber
IMHO solusi terbaik:
dalam fragmen:
kemudian di onViewStateRestored dari Fragment:
sumber
Aktivitas Anda menerima panggilan balik seperti yang harus digunakan:
Jika Anda ingin fragmen Anda menerima panggilan balik maka lakukan ini:
dan mengimplementasikan
onClickListener
antarmuka pada Fragmentsumber