Apa tujuan utama metode seperti setTag()
dan getTag()
dari View
jenis benda?
Apakah saya benar dalam berpikir bahwa saya dapat mengaitkan sejumlah objek dengan satu Tampilan?
Apa tujuan utama metode seperti setTag()
dan getTag()
dari View
jenis benda?
Apakah saya benar dalam berpikir bahwa saya dapat mengaitkan sejumlah objek dengan satu Tampilan?
Katakanlah Anda menghasilkan banyak tampilan yang serupa. Anda dapat mengatur OnClickListener
untuk setiap tampilan secara individual:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Maka Anda harus membuat onClick
metode unik untuk setiap tampilan meskipun mereka melakukan hal serupa, seperti:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Ini karena onClick
hanya memiliki satu parameter, a View
, dan harus mendapatkan informasi lain dari variabel instan atau variabel lokal akhir dalam melampirkan cakupan. Yang kami inginkan adalah mendapatkan informasi dari pandangan sendiri .
Masukkan getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Sekarang kita bisa menggunakan OnClickListener yang sama untuk setiap tombol:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
Ini pada dasarnya cara bagi pandangan untuk memiliki ingatan .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
harus melakukan trik untuk bagian warna. 20 hanyalah pengganti untuk posisi validasi Tampilan Anda.Saya ingin menambahkan beberapa kata.
Meskipun menggunakan
get/setTag(Object)
tampaknya sangat berguna dalam kasus tertentu dari pola ViewHolder, saya akan merekomendasikan untuk berpikir dua kali sebelum menggunakannya dalam kasus lain. Hampir selalu ada solusi lain dengan desain yang lebih baik.Alasan utamanya adalah kode seperti itu menjadi tidak dapat didukung dengan cepat.
Tidak jelas bagi pengembang lain apa yang Anda rancang untuk disimpan sebagai tag di tampilan. Metodenya
setTag/getTag
tidak deskriptif sama sekali.Ini hanya menyimpan
Object
, yang perlu dilemparkan ketika Anda maugetTag
. Anda bisa mendapatkan crash yang tidak terduga nanti ketika Anda memutuskan untuk mengubah jenis objek yang disimpan dalam tag.Inilah kisah nyata: Kami memiliki proyek yang cukup besar dengan banyak adaptor, operasi async dengan pandangan dan sebagainya. Satu pengembang memutuskan untuk
set/getTag
menjadi bagian dari kodenya, tetapi yang lain telah menetapkan tag pada tampilan ini. Pada akhirnya, seseorang tidak dapat menemukan tag sendiri dan sangat bingung. Kami butuh beberapa jam untuk menemukan bug.setTag(int key, Object tag)
terlihat jauh lebih baik, karena Anda dapat membuat kunci unik untuk setiap tag (menggunakan sumber daya id ), tetapi ada batasan yang signifikan untuk Android <4.0. Dari Lint docs:sumber
Kita dapat menggunakan
setTag()
dangetTag()
untuk mengatur dan mendapatkan objek kustom sesuai kebutuhan kita. ThesetTag()
Metode membawa argumen dari jenisObject
, dangetTag()
mengembalikan sebuahObject
.Sebagai contoh,
sumber
Untuk pengembang web, ini tampaknya setara dengan data- ..
sumber
Ini sangat berguna untuk
ArrayAdapter
penggunaan khusus . Ini semacam optimisasi. Ada yangsetTag
digunakan sebagai referensi untuk objek yang referensi pada beberapa bagian tata letak (yang menampilkanListView
) bukanfindViewById
.sumber
Referensi: http://developer.android.com/reference/android/view/View.html
sumber
Pengaturan TAG sangat berguna ketika Anda memiliki ListView dan ingin mendaur ulang / menggunakan kembali tampilan. Dengan cara itu ListView menjadi sangat mirip dengan RecyclerView yang lebih baru.
sumber