Android xml hatası: RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen) ile "Verilen adla eşleşen kaynak bulunamadı"


92

Tamam, yani bu beni gerçekten kızdırmaya başladı. Bu hata çok mantıklı değil, çok özel bir şekilde ortaya çıkıyor.

Bu hatayla ilgili diğer sorulara zaten baktığımı söyleyerek başlayayım, Google da yaptı. Anlayabildiğim kadarıyla, benzer sorunların çoğu, insanlar Stringaynı düzen dosyası içinde olmayan bir kaynağa veya başka bir şeye başvurdukları için ortaya çıkıyor , '@ id +' içindeki '+' veya benzeri bir şeyi yanlış yerleştiriyorlar.

Yaşadığım sorun, bir .xml düzeninde .xml dosyasında RelativeLayout. Bu, bir metin içeren a TableLayout, iki LinearLayouts ve son olarak a içerir ProgressBar. İstediğim, ilerleme çubuğunun ilgili düzen ile hizalanması android:layout_alignParentBottom="true"ve ardından ilerleme çubuğunun üzerindeki iki doğrusal düzeni hizalaması (alt doğrusal düzen, ilerleme çubuğunun üzerinde, diğeri alt doğrusal düzenin üzerinde hizalanır ).

Yeterince basit olmalı ve çalışıyormuş gibi görünmelidir, yani grafik görünüm istenen sonucu gösterir. Ancak, ve işte sorun geliyor , Eclipse bana iki doğrusal düzende bir hata veriyor,

"Hata: Verilen adla eşleşen kaynak bulunamadı ('layout_above'da' @ id / LinearLayout_acc 'değeriyle)."

ve ilerleme çubuğuna atıfta bulunan diğer doğrusal düzen için aynı hata. Üç defadan fazla yazım hatası olmadığını kontrol ettim (id'ler aynı zamanda paketadı.R.java'da da var) ve projeyi bir düzine kez temizlemeyi denedim.

Projeyi çalıştırmaya karar verene kadar kaydederken (ve otomatik oluştururken) hatayı almıyorum. Bir başka garip şey de, üstteki doğrusal düzen yerine ilerleme çubuğundan alt doğrusal düzene baktığımda hata almıyorum!

Düzen dosyam:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_activity" >
        <TableLayout
             ... />

        <LinearLayout
            android:id="@+id/LinearLayout_dist"
            android:layout_above="@id/LinearLayout_acc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp" >

            <TextView
                ... />

            <TextView
                ... />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/LinearLayout_acc"
            android:layout_above="@id/ProgressBar_statusScreen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true" >

            <TextView
                ... />

            <TextView
                ... />
        </LinearLayout>

        <ProgressBar
            android:id="@+id/ProgressBar_statusScreen"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="16dp" />

</RelativeLayout>

Lütfen yardım edin, bu hataya neyin sebep olduğu hakkında hiçbir fikrim yok!

Cevaplarla düzenleyin

Shrikant, mizanpaj dosyasındaki görünüm sırasını değiştirme çözümüyle geldi, böylece elemanlar, referans okunduğunda yalnızca önceden tanımlanmış diğer öğelere başvurur.
Diğerleri, yayınlanan değişen gibi Ayrıca @id/etmek @+id/bile referans, hata mesajlarını kaldırmak yapar. Marco W.'nin bu ileti dizisinde yazdığı gibi , mesele şu ki, @+id/her bir id'den ilk bahsedildiğinde kullanmanız ve daha sonra kullanmanız gerekir @id/, ancak ilk sefer bir tanım olmasa da.

Tasarımın çoğunu yaptım ve atıfta bulunulan id'leri Eclipse'in grafik düzenleyicisinde ayarladım, böylece bir hata mesajı ile sonuçlanan kod otomatik olarak eklendi. Belki bu Eclipse'deki bir hatadır.

Yanıtlar:


77

Lütfen aşağıdaki kodu kontrol edin

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ic_launcher" >

<TableLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<LinearLayout
    android:id="@+id/LinearLayout_dist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/LinearLayout_acc"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="10dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FIRST" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SECOND" />
   </LinearLayout>

   <LinearLayout
    android:id="@+id/LinearLayout_acc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/ProgressBar_statusScreen"
    android:layout_centerHorizontal="true" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="THIRD" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FOURTH" />
   </LinearLayout>

   <ProgressBar
    android:id="@+id/ProgressBar_statusScreen"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_margin="16dp" />

 </RelativeLayout>

Ayrıca aşağıdaki bağlantıyı da kontrol edin . Android: layout_below = "@ id / myTextView", "myTextView" kimliğine sahip bir öğeyi, kullandığınız öğeden sonra yazılırsa tanımayacağını söylüyor.


8
Bu yorum için teşekkürler: android: layout_below = "@ id / myTextView", içinde kullandığınız öğeden sonra yazılmışsa "myTextView" kimliğine sahip bir öğeyi tanımaz . Öğeleri "doğru" sırayla yazmak zorunda olmanın saçma olduğunu düşünmeme rağmen bu sorunu çözdü ... Muhtemelen bir hata.
stemadsen

4
Elbette bu bir hata. Düzen kimlikleri, tanım sırasından bağımsız olmalıdır. Özellikle Android Studio'daki ekran düzeni tasarımcısının bununla hiçbir sorunu olmaması can sıkıcı.
dodgy_coder

@stemadsen bir hata değil. ayrıştırıcı basitçe görünümü oluşturur ve görünüm öğesi ile ilk karşılaştığı anda referanslar (Id). ziyaret edilmemiş bir öğeyi referans veriyorsunuz. A'nın kendisini B'nin altında tanımladığı ve daha sonra B'nin kendisini A'nın altında tanımladığı bir senaryoyu düşünün. Sıralama sınırlaması mantıksal sorunu çözer
Masoud Dadashi

Burada şunu belirtmeme izin verin: Üzerinde çalıştığınız UI öğesinden SONRA yazılan (daha önce değil) UI öğeleri için referans yapmak mümkün değildir.
ivanleoncz

85

değişiklik

@id/LinearLayout_acc

-e

@+id/LinearLayout_acc

3
Vay canına, bu gerçekten işe yarıyor. Düşündüm @id/, mevcut kimliği var referans içindi @+id/yeni id en oluşturmak için ve bu verebilecek değil değiştirilebilen. Bu yaklaşım nasıl yasaldır? Kimliği iki kez tanımlıyorum?
stemadsen

aslında, id için uzun bir değerdir, @ + id / bazı uzun değerleri ifade eder. ve eğer bir bileşene bazı id değeri atadıysak, bu durumda görünümlere referans vermek için sadece bu kimliği kullanabiliriz.
jeet

Kulağa garip geliyor, çünkü diğer tüm düzenlerde diğer kimliklere @ id / ile değil @ + id / ile başvuruyorum. Ayrıca, Shrikant'ın aşağıda belirtildiği gibi, başvurulan öğelerin sırasını değiştirirsem, @ id / ile çalışır.
stemadsen

1
Öğeleri Göreceli Düzende, ekranda görünecekleri sırada tutmanın gerçekten güzel bir yolu, tam olarak aradığım şey.
GLee

2
EVET EFENDİM! Bu adama bir madalya verin. Daha sonra mizanpajda oluşturulan bir Görünüme başvurmanız gerekirse, tam olarak yapmanız gereken şey budur.
Yoraco Gonzales

15

Bir kimliği tanımlarken veya referans verirken her kimliği @idolarak değiştirin @+id. Bununla, alamayacaksın

Android xml hatası: RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen) ile "Verilen adla eşleşen kaynak bulunamadı".


2
 <LinearLayout
        android:id="@+id/LinearLayout_dist"
        android:layout_above="@+id/LinearLayout_acc" <--- here might be a problem you forgot + sign
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp" >
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.