Android-XML-Fehler: "Keine Ressource gefunden, die dem angegebenen Namen entspricht" mit RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

Okay, das nervt mich wirklich. Dieser Fehler tritt auf eine ganz besondere, nicht sehr logische Weise auf.

Lassen Sie mich zunächst sagen, dass ich mir bereits die anderen Fragen zu diesem Fehler angesehen habe, Google auch. Soweit ich das beurteilen kann, treten die meisten ähnlichen Probleme auf, weil Benutzer auf eine StringRessource oder etwas anderes verweisen, das nicht in derselben Layoutdatei enthalten ist, und das '+' in '@ id +' oder ähnlichem falsch platzieren.

Das Problem, das ich habe, tritt in einer XML-Layoutdatei mit einem auf RelativeLayout. Dies enthält a TableLayout, zwei LinearLayouts mit Text und schließlich a ProgressBar. Was ich möchte, ist, dass der Fortschrittsbalken mit dem relativen Layout ausgerichtet wird, indem android:layout_alignParentBottom="true"die beiden linearen Layouts über dem Fortschrittsbalken ausgerichtet werden (das untere lineare Layout wird über dem Fortschrittsbalken ausgerichtet, das andere über dem unteren linearen Layout).

Es sollte einfach genug sein und so aussehen, als ob es funktioniert, dh die grafische Ansicht zeigt das gewünschte Ergebnis. Und hier kommt das Problem : Eclipse gibt mir einen Fehler bei den beiden linearen Layouts.

"Fehler: Es wurde keine Ressource gefunden, die dem angegebenen Namen entspricht (bei 'layout_above' mit dem Wert '@ id / LinearLayout_acc')."

und der gleiche Fehler für das andere lineare Layout, der sich auf den Fortschrittsbalken bezieht. Ich habe mehr als dreimal überprüft, ob es keine Tippfehler gibt (die IDs sind auch in packagename.R.java vorhanden), und ich habe ein Dutzend Mal versucht, das Projekt zu bereinigen.

Ich erhalte den Fehler beim Speichern (und beim automatischen Erstellen) erst, wenn ich mich entscheide, das Projekt auszuführen. Eine andere seltsame Sache ist, dass ich keinen Fehler bekomme, wenn ich mich auf das untere lineare Layout in der Fortschrittsanzeige anstatt auf das obere lineare Layout beziehe!

Meine Layoutdatei:

<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>

Bitte helfen Sie, ich habe keine Ahnung, was diesen Fehler verursacht!

Mit Antworten bearbeiten

Shrikant hatte die Lösung, die Reihenfolge des Erscheinungsbilds in der Layoutdatei so zu ändern, dass Elemente nur auf andere Elemente verweisen, die bereits beim Lesen der Referenz definiert wurden.
Wie andere bereits gepostet haben, werden durch das Ändern @id/in @+id/, auch in einer Referenz, die Fehlermeldungen entfernt. Wie Marco W. in diesem Thread schrieb , müssen Sie @+id/das erste Mal verwenden @id/, wenn jede ID erwähnt wird, und anschließend verwenden , auch wenn das erste Mal möglicherweise keine Definition ist.

Ich habe den größten Teil des Designs erstellt und die angegebenen IDs im grafischen Editor von Eclipse festgelegt, sodass automatisch Code eingefügt wurde, der zu einer Fehlermeldung führte. Vielleicht ist dies ein Fehler in Eclipse.

stemadsen
quelle

Antworten:

77

Bitte überprüfen Sie den folgenden Code

<?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>

Überprüfen Sie auch den folgenden Link . Es heißt, dass android: layout_below = "@ id / myTextView" ein Element mit der ID "myTextView" nicht erkennt, wenn es nach dem Element geschrieben wird, in dem Sie es verwenden.

Shrikant
quelle
8
Vielen Dank für diesen Kommentar: android: layout_below = "@ id / myTextView" erkennt ein Element mit der ID "myTextView" nicht, wenn es nach dem Element geschrieben wird, in dem Sie es verwenden . Dies hat das Problem behoben, obwohl ich es lächerlich finde, dass Sie die Elemente in der "richtigen" Reihenfolge schreiben müssen ... Möglicherweise ein Fehler.
Stemadsen
4
Dies ist sicher ein Fehler. Die Layout-IDs sollten unabhängig von der Definitionsreihenfolge sein. Besonders ärgerlich, dass der Bildschirmlayout-Designer in Android Studio keine Probleme damit hat.
dodgy_coder
@stemadsen es ist kein Fehler. Der Parser erstellt einfach die Ansicht und ihre Aktualisierungen (ID), wenn er das Ansichtselement zum ersten Mal erfüllt. Sie verweisen auf ein nicht besuchtes Element. Stellen Sie sich ein Szenario vor, in dem sich A unter B und später B unter A definiert. Die Einschränkung der Reihenfolge löst das logische Problem
Masoud Dadashi
Lassen Sie mich hier bemerken: Es ist nicht möglich, Verweise auf das UI-Element, an dem Sie arbeiten, für UI-Elemente zu erstellen, die danach geschrieben wurden (nicht vorher).
ivanleoncz
85

Veränderung

@id/LinearLayout_acc

zu

@+id/LinearLayout_acc
jeet
quelle
3
Wow, das funktioniert tatsächlich. Ich dachte, ich würde @id/auf vorhandene IDs verweisen @+id/, neue IDs erstellen und diese könnten nicht ausgetauscht werden. Wie kommt es, dass dieser Ansatz legal ist? Ich definiere die ID dann zweimal?
Stemadsen
Tatsächlich ist es ein langer Wert für id, @ + id / bezieht sich auf einen langen Wert. Wenn wir einer Komponente einen ID-Wert zugewiesen haben, können wir nur diese ID verwenden, um auf die Ansichten zu verweisen.
Jeet
Das klingt seltsam, weil ich in allen anderen Layouts andere IDs mit @ id / und nicht mit @ + id / verweise. Wie Shrikant unten bemerkte, funktioniert es auch mit @ id /, wenn ich die Reihenfolge der referenzierten Elemente ändere.
Stemadsen
1
Wirklich gute Möglichkeit, Elemente in einem relativen Layout in der Reihenfolge zu halten, in der sie auf dem Bildschirm angezeigt werden, genau das, wonach ich gesucht habe.
GLee
2
JAWOHL! Gebt dem Mann einen Orden. Dies ist genau das, was Sie tun müssen, wenn Sie auf eine Ansicht verweisen möchten, die später im Layout erstellt wird.
Yoraco Gonzales
15

Ändern Sie jede ID @idin @+id, unabhängig davon, wann eine ID definiert oder referenziert wird. Mit diesem werden Sie nicht bekommen

Android-XML-Fehler: "Keine Ressource gefunden, die dem angegebenen Namen entspricht" mit RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

AkashG
quelle
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" >
Hardik Nadiyapara
quelle