Düzen xml dosyasına dahil edildiğinde kimlik belirtme


117

Düzen xml dosyamda, başka düzen xml dosyası (her biri farklı bir android kimliğine sahip) ekledim.

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

Ama onu emülatörde çalıştırdığımda ve Hierarchy Viewer'ı başlattığımda, düzenlerin her biri hala 'NO_ID' gösteriyor ve benim kodumda, bende var findViewById(R.id.test1)ve findViewById(R.id.test2)her ikisi de null döndürüyor.

Herhangi biri lütfen sorunumda bana yardım edebilir mi?


6
Kimliklerinizde @sembolü eksik .
AutonomousApps

Yanıtlar:


288

Kimliği giriniz <include>

<include layout="@layout/test" android:id="@+id/test1" />

Ardından findViewById, yerleşimdeki alanlara erişmek için iki kullanın

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

Bu yaklaşımı kullanarak, sahip olduğunuz herhangi bir kapsamdaki herhangi bir alana erişebilirsiniz.


18
Bu yöntem, test1View nesnesi için bana boş değer döndürür.
Nirav Shah

4
Farkı gerçekten görmüyorum, açıklayabilir misin?
Goddchen

30
Dahil ettiğimiz düzen birleştirme kullanıyorsa, bunun yardımcı olmayacağını öğrendim. Ancak birleştirmenin kullanılmadığı durumlarda bu işe yarar.
Zlatko

@Zlatko Yep, ve bu mergeteoride bile işe yaramaz , çünkü a eklemenin sonucu mergetek bir görünüm değil, bir grup görünümdür. O zaman tamam.
Görünen Ad

1
Bu, yalnızca birleştirme kullanılmadığında işe yarar. Birleştirme durumunda, burada belirtildiği gibi mümkün değildir: code.google.com/p/android/issues/detail?id=36918#c3
Zahid Rasheed

61

<merge>Dahil etme düzeninizde etiketi kullanıyorsanız , o zaman include kimliğinin gerçek görünüm olmayan birleştirme etiketine aktarıldığını öğrendim .

Yani ya birleştirmeyi kaldırın ya da bir düzen ile değiştirin.

Tor Norbye şunu yazdı :

<include>Etiketi bir gerçek görünüm değil, bu yüzden findByView bulamaz. @İd özniteliği (ve include etiketinde ayarladığınız diğer öznitelikler) bunun yerine dahil edilen düzenin kök etiketine uygulanır. Dolayısıyla, activity.getView (R.id.included1), aslında <TextView>kendisi olmalıdır.


3
İyi bir. Birleştirme etiketini kaldırıyorum ve çalışmaya başlıyor ama benim sorum şu ki, herhangi bir dahil düzeni onsuz çalışıyorsa birleştirme etiketinin kullanımı nedir?
Ankur Chaudhary

35

Romain Guy , etiketin içine bir nitelik ekleyerek dahil edilen bir düzenin kimliğini geçersiz kılabileceğinizi belirtir .android:id<include>

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />

1
Doğru. Dahil edilen düzen dosyasında kök öğeye referans vermenin yolu, 'include' etiketinde verilen id'dir (verilmediği sürece).
Tom R

1
<include> içindeki kimlik = dahil edilen düzendeki kökün kimliği
Fadils

İlk önce kimliği ayarlarsam (dahil etme etiketinde, dahil edilen düzendeki kimliği geçersiz kılar, değil mi?), İnclude etiketinin başlangıçta '@ + id / cell1' ve ardından layout = 'olması gerektiğini düşünüyorum. @ layout / workspace_screen ', dahil edilen düzenin id'si ile android: id'yi tekrar geçersiz kılacaktır. @Ron Romero'nun cevapları bana daha mantıklı geliyor.
Neon Warge

14

Bence en üstteki yanıt en önemli noktayı gözden kaçırıyor ve insanları <include/>etiketin dahil edilen içerikleri tutan bir Görünüm oluşturduğunu düşünmeye yönlendirebilir .

Kilit noktası 's dahil olmasıdır id edilir geçirilen kök görünümüne düzenini dosyası içerir.

Bunun anlamı:

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

Şuna dönüşür:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

4

evet böyledir, ancak içerme alanına eklenen düzen özel olduğunda ve bu kök düzenine erişmek istediğinizde dikkatli olun. Bu durumda @ layout / test testindeki bu düzen aslında ilk satırda döndürülür.

test test1View = (test)findViewById(R.id.test1);


2

Sorun şu ki, mevcut layout dosyasında belirtilmeyen id'yi kullanmaya çalışıyoruz. Tekrar bildirmek yerine, id kullanılarak basitçe başvurulabilir @+id/. Orijinal kimlik adını Android Studio aracılığıyla yeniden düzenlerseniz, dahil edilen düzende de yeniden düzenleme yapar.

<include layout="@layout/toolbar"/>

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

2

Şişirilmiş görünümün bir örneğini kullanarak <RecyclerView>id'yi bulma durumunda, <include>yoksa boş döndürür .

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }

1

İd'yi dahil edilen düzenin herhangi bir kök etiketine ayarladıysanız, bu kimliği kullanabilir veya kimliği dahil edilen düzene ayarlayabilirsiniz.

Ancak her ikisine de id ayarlayamazsınız, istisna atabilir.

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

Veya

<include layout="@layout/view_contact_name"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

0

Dahil etme hakkında konuşurken, ya dahil edilen düzen dosyasının içindeki kök görünümde ya da dahil etme satırının kendisinde bir kimliğiniz vardır ve her ikisinde de yoktur. Örneğin:

<include layout="@layout/layout1" android:id="@+id/layout1"/>

Düzen 1 dosyası

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

Yukarıdaki örnek yanlıştır çünkü teknik olarak aynı düzen için beyan edilmiş iki kimliğiniz vardır. Öyleyse yapmanız gereken, hangi öğenin kimliğine sahip olacağını seçmek.


0

Vay canına, bu sorunun henüz doğru cevabı olmadığına inanamıyorum. Basit etiketler berbat. Yalnızca ile başlayan şeyi değiştirebilirsiniz android:layout_hangi android:ideşleşmiyor. Yani cevap yapamazsın. Afedersiniz. Bunun yerine yapabileceğiniz şey, içerideki görünümleri şişirecek bir ViewGroup olacak bir sınıf oluşturmak ve ardından bunu mizanpajınıza bir etiket olarak eklemek, ama hepsi bu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.