Android'e id
genel bakış
Android id
, görünümleri tanımlamak için yaygın olarak kullanılan bir tamsayıdır; Bu id
XML (mümkün) ve kodu aracılığıyla yoluyla tayin edilebilir (programlı.) id
XML ile belirlenen bir referans almak için en yararlı olan View
lar bir tarafından üretilen Inflater
(örneğin, kullanılmasıyla olduğu gibi setContentView
.)
Ata id
üzeriXML
- Bir özellik ekle
android:id="@+id/
SomeName "
görünümünüze.
- Uygulamanız oluşturulduğunda, kodda kullanılmak üzere benzersiz
android:id
bir atanır . int
- Sizin referans
android:id
'ın int
'kullanarak kod değeri R.id.
somename'(etkili sabiti.)
- Bu
int
yapı dan sürüme değişebilir böylece bir kimliği kopyalamak asla gelen gen/
package.name/ R.java
sadece "kullanın R.id.
somename".
- (Ayrıca, XML'de a'ya
id
atanmış bir URL oluşturulurken Preference
kullanılmaz .)Preference
View
Kodla ata id
(programlı olarak)
- İnt
id
kullanarak manuel olarak ayarlamasomeView.setId(
);
int
Pozitif olmalıdır, ancak aksi takdirde ne istersen olabilir arbitrary- (bu korkutucu ise okumaya devam.)
- Örneğin, öğeleri temsil eden birkaç görünüm oluşturuyor ve numaralandırıyorsanız, öğe numaralarını kullanabilirsiniz.
Tekliği id
s
XML
atanan id
s benzersiz olacaktır.
- Kod atanan
id
ler do not benzersiz olmak zorunda
- Kod atanan
id
s (teorik olarak) atanmış s ile XML
çakışabilir id
.
- Bu çelişkiler
id
doğru sorgulandığında önemli olmayacaktır (okumaya devam edin) .
Çatışmanın id
ne zaman (ve neden) önemli olmadığı
findViewById(int)
belirttiğiniz Görünüm'deki görünüm hiyerarşisi içinde önce derinlik yinelemesini yineleyecek ve View
bulduğu ilk eşlemeyi döndürecektir id
.
- Hiyerarşide
id
XML tanımlı bir koddan önce atanmış kod atanmamışlar olmadığı sürece , XML tanımlı Görünümü her zaman döndürür 'd.id
findViewById(R.id.somename)
id
Dinamik Görüntüleme ve Atama oluşturma ID
s
Görüşlerinizle ilgili referansları tutmayı seçerseniz , bunları somutlaştırdığınızdan getApplicationContext()
ve her referansı null değerine ayarladığınızdan emin olun onDestroy
. Görünüşe göre sızıntıActivity
(o sonra yok edilir üzerine asılı) savurganlıktır .. :)
Kodda android:id
kullanmak için XML ayırma
View.generateViewId()
Benzersiz bir kimlik oluşturan API 17 tanıtıldı . (Bunu belirtmek için şans-değişiklik-değişiklikleri sayesinde.) *
Senin Eğer ViewGroup
kutu XML üzerinden tanımlanamaz (veya siz olmak istemiyorum) bunun eşsiz kalmasını sağlamak için XML üzerinden id ayırabilir:
Burada, değerleri / ids.xml bir özel tanımlar id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Ardından ViewGroup veya View oluşturulduktan sonra özel kimliği ekleyebilirsiniz
myViewGroup.setId(R.id.reservedNamedId);
Çelişkili id
örnek
Şaşırtıcı bir örnekle netlik için id
, sahne arkasında bir çatışma olduğunda neler olduğunu inceleyelim .
düzen / 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>
Bir çatışmayı simüle etmek için, en son derlememize R.id.placeholder
( @+id/placeholder
) int
değeri atadığını söyleyelim 12
.
Daha sonra, MyActivity.java program aracılığıyla bazı ekler görünümleri tanımlar (kod aracılığıyla):
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);
}
Yani placeholder
, yeni TextView
slarımızdan id
birinde 12 tane var! Ancak, yer tutucunun alt görünümlerini sorgularsak bu gerçekten sorun olmaz:
// 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);
*O kadar kötü değil