Dalam file XML, kita dapat menetapkan ID ke tampilan suka android:id="@+id/something"
lalu panggil findViewById()
, tetapi saat membuat tampilan secara pemrograman, bagaimana cara menetapkan ID?
Saya pikir setId()
tidak sama dengan tugas standar. setId()
tambahan.
Adakah yang bisa memperbaiki saya?
Jawaban:
id
Ikhtisar AndroidAndroid
id
adalah bilangan bulat yang biasa digunakan untuk mengidentifikasi tampilan; iniid
dapat diberikan melalui XML (bila memungkinkan) dan melalui kode (terprogram.) Yangid
paling berguna untuk mendapatkan referensi untuk XML-View
s yang dihasilkan olehInflater
(misalnya dengan menggunakansetContentView
.)Tetapkan
id
melaluiXML
android:id="@+id/
samaran"
ke tampilan Anda.android:id
akan diberi kode unikint
untuk digunakan.android:id
'sint
nilai dalam kode menggunakan "R.id.
somename'(efektif konstan.)int
dapat berubah dari build ke build jadi jangan pernah menyalin id darigen/
package.name/R.java
, cukup gunakan "namaR.id.
samaran".id
ditugaskan kePreference
dalam XML tidak digunakan ketikaPreference
menghasilkan ituView
.)Tetapkan
id
melalui kode (terprogram)id
menggunakan ssomeView.setId(
int);
int
harus positif, tetapi sebaliknya - itu bisa menjadi apa pun yang Anda inginkan (terus membaca jika ini menakutkan.)Keunikan
id
sXML
-ditugaskanid
akan menjadi unik.id
s tidak tidak harus unikid
dapat (secara teoritis) bertentangan denganXML
-ditugaskanid
.id
S yang saling bertentangan ini tidak masalah jika ditanya dengan benar (terus membaca) .Kapan (dan mengapa) pertentangan
id
tidak masalahfindViewById(int)
akan mengulangi kedalaman-pertama secara rekursif melalui hierarki tampilan dari tampilan yang Anda tentukan dan mengembalikan yang pertamaView
ditemukannya dengan pencocokanid
.id
ditugaskan sebelum XML-didefinisikanid
dalam hierarki,findViewById(R.id.somename)
akan selalu mengembalikan XML-defined View jadiid
.Secara dinamis Membuat Tampilan dan Penugasan
ID
sViewGroup
denganid
.LinearLayout
denganandroid:id="@+id/placeholder"
.ViewGroup
denganView
.id
yang nyaman untuk setiap tampilan.Query pandangan anak ini menggunakan placeholder.findViewById (convenientInt);
API 17 diperkenalkan
View.generateViewId()
yang memungkinkan Anda menghasilkan ID unik.Jika Anda memilih untuk menyimpan referensi untuk pandangan Anda di sekitar , pastikan untuk instantiate dengan
getApplicationContext()
dan pastikan untuk mengatur setiap referensi menjadi nolonDestroy
. Rupanya bocor yangActivity
(menggantung ke atasnya setelah itu hancur) adalah boros .. :)Cadangan XML
android:id
untuk digunakan dalam kodeAPI 17 diperkenalkan
View.generateViewId()
yang menghasilkan ID unik. (Terima kasih telah mengambil kesempatan untuk melakukan perubahan karena menunjukkan ini.) *Jika Anda
ViewGroup
tidak dapat didefinisikan melalui XML (atau Anda tidak menginginkannya), Anda dapat memesan id melalui XML untuk memastikannya tetap unik:Di sini, nilai / ids.xml mendefinisikan sebuah kustom
id
:Kemudian setelah ViewGroup atau View dibuat, Anda dapat melampirkan id khusus
id
Contoh yang saling bertentanganUntuk kejelasan dengan cara mengaburkan contoh, mari kita periksa apa yang terjadi ketika ada
id
konflik di belakang layar.layout / mylayout.xml
Untuk mensimulasikan konflik, katakanlah build terbaru kami menetapkan
R.id.placeholder
(@+id/placeholder
)int
nilai dari12
..Selanjutnya, MyActivity.java mendefinisikan beberapa tampilan tambah secara terprogram (melalui kode):
Jadi
placeholder
dan salah satu dari kami yang baruTextView
memilikiid
12! Tapi ini sebenarnya bukan masalah jika kami meminta pandangan anak-anak placeholder:*Tidak begitu buruk
sumber
findViewById
melakukan eksplorasi mendalam-pertama, jadi "Selama tidak ada id yang ditetapkan kode yang ditetapkan di atas id yang ditentukan XML dalam hierarki" secara teknis tidak benar; itu "sebelum" daripada "di atas".ids.xml
. Untuk ID yang benar-benar arbitrer, gunakanView.generateViewId()
(API 17). (Tolong jelaskan poin Anda jika saya melewatkannya.)PreferenceDialogFragmentCompat
itu sepertinya id dariR.id
tidak cocok dengan hierarki tampilan yang. Dengan cara ini saya tidak dapat menemukan tampilan dengan ID.Anda bisa menggunakan
View.setId(integer)
ini untuk ini. Dalam XML, meskipun Anda sedang mengatur String id, ini akan dikonversi menjadi integer. Karena ini, Anda dapat menggunakan Integer (positif) apa pun untukViews
ditambahkan secara terprogram.Penghargaan untuk jawaban ini .
sumber
Ya, Anda dapat memanggil
setId(value)
dalam tampilan apa pun dengan nilai integer (positif) apa pun yang Anda suka dan kemudian menemukannya di wadah induk menggunakanfindViewById(value)
. Perhatikan bahwa valid untuk memanggilsetId()
dengan nilai yang sama untuk tampilan saudara yang berbeda, tetapifindViewById()
hanya akan mengembalikan yang pertama.sumber
findViewById
leluhur yang dikenal adalah ide yang bagus untuk alasan kinerja, tetapi tidak menjamin akan menemukan anak langsung jika ada satu dengan ID yang benar.