Android'e idgenel bakış
Android id, görünümleri tanımlamak için yaygın olarak kullanılan bir tamsayıdır; Bu idXML (mümkün) ve kodu aracılığıyla yoluyla tayin edilebilir (programlı.) idXML ile belirlenen bir referans almak için en yararlı olan Viewlar 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
intyapı dan sürüme değişebilir böylece bir kimliği kopyalamak asla gelen gen/package.name/ R.javasadece "kullanın R.id.somename".
- (Ayrıca, XML'de a'ya
idatanmış bir URL oluşturulurken Preferencekullanılmaz .)PreferenceView
Kodla ata id(programlı olarak)
- İnt
idkullanarak manuel olarak ayarlamasomeView.setId();
intPozitif 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 ids
XMLatanan ids benzersiz olacaktır.
- Kod atanan
idler do not benzersiz olmak zorunda
- Kod atanan
ids (teorik olarak) atanmış s ile XMLçakışabilir id.
- Bu çelişkiler
iddoğru sorgulandığında önemli olmayacaktır (okumaya devam edin) .
Çatışmanın idne 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 Viewbulduğu ilk eşlemeyi döndürecektir id.
- Hiyerarşide
idXML 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.idfindViewById(R.id.somename)id
Dinamik Görüntüleme ve Atama oluşturma IDs
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:idkullanmak 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 ViewGroupkutu 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) intdeğ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 TextViewslarımızdan idbirinde 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