idIkhtisar Android
Android idadalah bilangan bulat yang biasa digunakan untuk mengidentifikasi tampilan; ini iddapat diberikan melalui XML (bila memungkinkan) dan melalui kode (terprogram.) Yang idpaling berguna untuk mendapatkan referensi untuk XML- Views yang dihasilkan oleh Inflater(misalnya dengan menggunakan setContentView.)
Tetapkan idmelaluiXML
- Tambahkan atribut nama
android:id="@+id/samaran "ke tampilan Anda.
- Ketika aplikasi Anda dibangun,
android:idakan diberi kode unik int untuk digunakan.
- Referensi Anda
android:id's intnilai dalam kode menggunakan "R.id. somename'(efektif konstan.)
- ini
intdapat berubah dari build ke build jadi jangan pernah menyalin id dari gen/package.name/ R.java, cukup gunakan "nama R.id.samaran".
- (Juga,
idditugaskan ke Preferencedalam XML tidak digunakan ketika Preferencemenghasilkan itu View.)
Tetapkan idmelalui kode (terprogram)
- Set secara manual
idmenggunakan 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 ids
XML-ditugaskan id akan menjadi unik.
- Kode-ditugaskan
ids tidak tidak harus unik
- Kode yang ditugaskan
iddapat (secara teoritis) bertentangan dengan XML-ditugaskan id.
idS yang saling bertentangan ini tidak masalah jika ditanya dengan benar (terus membaca) .
Kapan (dan mengapa) pertentangan idtidak masalah
findViewById(int)akan mengulangi kedalaman-pertama secara rekursif melalui hierarki tampilan dari tampilan yang Anda tentukan dan mengembalikan yang pertama Viewditemukannya dengan pencocokan id.
- Selama tidak ada kode yang
idditugaskan sebelum XML-didefinisikan iddalam hierarki, findViewById(R.id.somename)akan selalu mengembalikan XML-defined View jadi id.
Secara dinamis Membuat Tampilan dan Penugasan IDs
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:iduntuk 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 ViewGrouptidak 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);
idContoh yang saling bertentangan
Untuk kejelasan dengan cara mengaburkan contoh, mari kita periksa apa yang terjadi ketika ada idkonflik 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) intnilai 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 placeholderdan salah satu dari kami yang baru TextViewmemiliki id12! 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