id
Ikhtisar Android
Android id
adalah bilangan bulat yang biasa digunakan untuk mengidentifikasi tampilan; ini id
dapat diberikan melalui XML (bila memungkinkan) dan melalui kode (terprogram.) Yang id
paling berguna untuk mendapatkan referensi untuk XML- View
s yang dihasilkan oleh Inflater
(misalnya dengan menggunakan setContentView
.)
Tetapkan id
melaluiXML
- Tambahkan atribut nama
android:id="@+id/
samaran "
ke tampilan Anda.
- Ketika aplikasi Anda dibangun,
android:id
akan diberi kode unik int
untuk digunakan.
- Referensi Anda
android:id
's int
nilai dalam kode menggunakan "R.id.
somename'(efektif konstan.)
- ini
int
dapat berubah dari build ke build jadi jangan pernah menyalin id dari gen/
package.name/ R.java
, cukup gunakan "nama R.id.
samaran".
- (Juga,
id
ditugaskan ke Preference
dalam XML tidak digunakan ketika Preference
menghasilkan itu View
.)
Tetapkan id
melalui kode (terprogram)
- Set secara manual
id
menggunakan ssomeView.setId(
int);
- Itu
int
harus positif, tetapi sebaliknya - itu bisa menjadi apa pun yang Anda inginkan (terus membaca jika ini menakutkan.)
- Misalnya, jika membuat dan menomori beberapa tampilan yang mewakili item, Anda dapat menggunakan nomor itemnya.
Keunikan id
s
XML
-ditugaskan id
akan menjadi unik.
- Kode-ditugaskan
id
s tidak tidak harus unik
- Kode yang ditugaskan
id
dapat (secara teoritis) bertentangan dengan XML
-ditugaskan id
.
id
S yang saling bertentangan ini tidak masalah jika ditanya dengan benar (terus membaca) .
Kapan (dan mengapa) pertentangan id
tidak masalah
findViewById(int)
akan mengulangi kedalaman-pertama secara rekursif melalui hierarki tampilan dari tampilan yang Anda tentukan dan mengembalikan yang pertama View
ditemukannya dengan pencocokan id
.
- Selama tidak ada kode yang
id
ditugaskan sebelum XML-didefinisikan id
dalam hierarki, findViewById(R.id.somename)
akan selalu mengembalikan XML-defined View jadi id
.
Secara dinamis Membuat Tampilan dan Penugasan ID
s
Jika Anda memilih untuk menyimpan referensi untuk pandangan Anda di sekitar , pastikan untuk instantiate dengan getApplicationContext()
dan pastikan untuk mengatur setiap referensi menjadi nol onDestroy
. Rupanya bocor yang Activity
(menggantung ke atasnya setelah itu hancur) adalah boros .. :)
Cadangan XML android:id
untuk digunakan dalam kode
API 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
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Kemudian setelah ViewGroup atau View dibuat, Anda dapat melampirkan id khusus
myViewGroup.setId(R.id.reservedNamedId);
id
Contoh yang saling bertentangan
Untuk kejelasan dengan cara mengaburkan contoh, mari kita periksa apa yang terjadi ketika ada id
konflik di belakang layar.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Untuk mensimulasikan konflik, katakanlah build terbaru kami menetapkan R.id.placeholder
( @+id/placeholder
) int
nilai dari 12
..
Selanjutnya, MyActivity.java mendefinisikan beberapa tampilan tambah secara terprogram (melalui kode):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Jadi placeholder
dan salah satu dari kami yang baru TextView
memiliki id
12! Tapi ini sebenarnya bukan masalah jika kami meminta pandangan anak-anak placeholder:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Tidak begitu buruk