Błąd XML systemu Android: „Nie znaleziono zasobu pasującego do podanej nazwy” z RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

Okej, więc zaczyna mnie to naprawdę denerwować. Ten błąd pojawia się w bardzo specjalny, niezbyt logiczny sposób.

Zacznę od stwierdzenia, że ​​spojrzałem już na inne pytania dotyczące tego błędu, wygooglowałem też. O ile wiem, większość podobnych problemów występuje, ponieważ ludzie odwołują się do Stringzasobu lub czegoś innego, co nie znajduje się w tym samym pliku układu, zgubili znak „+” w „@ id +” lub coś podobnego.

Problem, który mam, występuje w pliku układu .xml z rozszerzeniem RelativeLayout. Zawiera a TableLayout, dwa LinearLayouts zawierające jakiś tekst i na koniec a ProgressBar. Chcę, aby pasek postępu był wyrównany z układem względnym za pomocą, android:layout_alignParentBottom="true"a następnie wyrównaj dwa układy liniowe nad paskiem postępu (dolny układ liniowy wyrównany nad paskiem postępu, drugi wyrównany nad dolnym układem liniowym).

Powinien być dość prosty i wyglądać, jakby działał, tj. Widok graficzny pokazuje pożądany efekt. Jednak i tu pojawia się problem , Eclipse daje mi błąd w dwóch układach liniowych,

„Błąd: nie znaleziono zasobu pasującego do podanej nazwy (w„ layout_above ”o wartości„ @ id / LinearLayout_acc ”).”

i ten sam błąd dla innego układu liniowego odnoszącego się do paska postępu. Ponad trzykrotnie sprawdziłem, czy nie ma literówek (identyfikatory istnieją również w nazwa_pakietu.R.java) i kilkanaście razy próbowałem wyczyścić projekt.

Nie pojawia się błąd podczas zapisywania (i automatycznego budowania), dopóki nie zdecyduję się uruchomić projektu. Inną dziwną rzeczą jest to, że kiedy odnoszę się do dolnego układu liniowego z paska postępu zamiast górnego układu liniowego, nie widzę błędu!

Mój plik układu:

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

Proszę o pomoc, nie mam pojęcia, co powoduje ten błąd!

Edytuj z odpowiedziami

Shrikant przyszedł z rozwiązaniem polegającym na zmianie kolejności pojawiania się w pliku układu, tak aby elementy odwoływały się tylko do innych elementów już zdefiniowanych podczas odczytywania odniesienia.
Ponadto, jak napisali inni, zmiana @id/na @+id/, nawet w pliku referencyjnym, usuwa komunikaty o błędach. Jak napisał Marco W. w tym wątku, chodzi o to, że musisz użyć @+id/pierwszego identyfikatora, gdy jest wymieniany, a następnie użyć go @id/później, nawet jeśli pierwszy raz może nie być definicją.

Wykonałem większość projektu i ustawiłem wskazane identyfikatory w edytorze graficznym Eclipse, więc kod, który spowodował wyświetlenie komunikatu o błędzie, został automatycznie wstawiony. Może to błąd w Eclipse.

stemadsen
źródło

Odpowiedzi:

77

Sprawdź poniższy kod

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

Sprawdź również poniższy link . Mówi, że android: layout_below = "@ id / myTextView" nie rozpozna elementu o identyfikatorze "myTextView", jeśli jest napisany po elemencie, w którym go używasz.

Shrikant
źródło
8
Dzięki za ten komentarz: android: layout_below = "@ id / myTextView" nie rozpozna elementu o identyfikatorze "myTextView", jeśli jest napisany po elemencie, w którym go używasz . To rozwiązało problem, chociaż myślę, że to śmieszne, że musisz pisać elementy w „prawidłowej” kolejności ... Prawdopodobnie błąd.
stemadsen
4
Na pewno jest to błąd. Identyfikatory układu powinny być niezależne od kolejności definicji. Szczególnie denerwujące jest to, że projektant układu ekranowego w Android Studio nie ma z tym problemu.
dodgy_coder
@stemadsen to nie jest błąd. parser po prostu tworzy widok i jego refrences (Id) po raz pierwszy napotyka element widoku. odnosisz się do nieodwiedzonego elementu. rozważ scenariusz, w którym A definiuje się poniżej B, a później B definiuje się poniżej A. ograniczenie uporządkowania rozwiązuje problem logiczny
Masoud Dadashi
Pozwólcie, że tutaj zauważę: nie jest możliwe tworzenie odniesień do elementu UI, nad którym pracujesz, dla elementów UI napisanych PO nim (nie wcześniej).
ivanleoncz
85

zmiana

@id/LinearLayout_acc

do

@+id/LinearLayout_acc
jeet
źródło
3
Wow, to faktycznie działa. Myślałem, że chodzi @id/o odwoływanie się do istniejących identyfikatorów, @+id/tworzenie nowych identyfikatorów i że nie można ich zamieniać. Dlaczego to podejście jest legalne? W takim razie dwukrotnie definiuję identyfikator?
stemadsen
właściwie jest to długa wartość dla id, @ + id / odnosi się do jakiejś długiej wartości. a jeśli przypisaliśmy jakąś wartość id do jakiegoś komponentu, możemy użyć tylko tego id do odniesienia się do widoków.
jeet
Brzmi to dziwnie, ponieważ we wszystkich innych układach odnoszę się do innych identyfikatorów za pomocą @ id /, a nie @ + id /. Ponadto, jak zauważył Shrikant poniżej, jeśli zmienię kolejność przywoływanych elementów, będzie działać z @ id /.
stemadsen
1
Naprawdę fajny sposób na utrzymanie elementów w układzie względnym w kolejności, w jakiej pojawią się na ekranie, dokładnie tak, jak szukałem.
GLee
2
TAK JEST! Daj temu mężczyźnie medal. To jest dokładnie to, co musisz zrobić, jeśli konieczne jest odniesienie do widoku utworzonego później w układzie.
Yoraco Gonzales
15

Zmień każdy identyfikator @idna @+id, bez względu na to, kiedy definiuje lub odwołuje się do identyfikatora. Dzięki temu nie dostaniesz

Błąd XML systemu Android: „Nie znaleziono zasobu pasującego do podanej nazwy” z RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

AkashG
źródło
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
źródło