Ошибка Android xml: «Ресурсы, соответствующие данному имени, не найдены» с RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

Ладно, это меня действительно начинает раздражать. Эта ошибка возникает особым, не очень логичным образом.

Позвольте мне начать с того, что я уже рассмотрел другие вопросы, касающиеся этой ошибки, и Google тоже. Насколько я могу судить, большинство подобных проблем возникает из-за того, что люди ссылаются на Stringресурс или что-то еще не в том же файле макета, они теряют '+' в '@ id +' или что-то подобное.

Проблема, с которой я столкнулся, возникает в файле макета .xml с расширением RelativeLayout. Он содержит a TableLayout, два LinearLayouts, содержащие некоторый текст, и, наконец, a ProgressBar. Я хочу, чтобы индикатор выполнения был выровнен с относительным макетом, используя, android:layout_alignParentBottom="true"а затем выровнял два линейных макета над индикатором выполнения (нижний линейный макет выравнивается над индикатором выполнения, другой выравнивается над нижним линейным макетом).

Он должен быть достаточно простым и выглядеть так, как будто он работает, то есть графическое представление показывает желаемый результат. Однако, и здесь возникает проблема , Eclipse дает мне ошибку в двух линейных макетах,

«Ошибка: не найден ресурс, соответствующий заданному имени (в 'layout_above' со значением '@ id / LinearLayout_acc')».

и та же ошибка для другого линейного макета, связанного с индикатором выполнения. Я более чем трижды проверил, нет ли опечаток (идентификаторы также существуют в packagename.R.java), и я пытался очистить проект десятки раз.

Я не получаю сообщение об ошибке при сохранении (и автоматическом построении), пока не решу запустить проект. Еще одна странность заключается в том, что когда я ссылаюсь на нижний линейный макет из индикатора выполнения вместо верхнего линейного макета, я не получаю ошибки!

Мой файл макета:

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

Пожалуйста, помогите, я понятия не имею, что вызывает эту ошибку!

Редактировать с ответами

Шрикант предложил решение изменить порядок отображения в файле макета, чтобы элементы ссылались только на другие элементы, уже определенные при чтении ссылки.
Кроме того, как писали другие, изменение @id/на @+id/даже в ссылке удаляет сообщения об ошибках. Как писал Марко В. в этой ветке, дело в том, что вы должны использовать @+id/первый раз, когда каждый идентификатор упоминается, а затем использовать @id/впоследствии, даже если первый раз может не быть определением.

Я сделал большую часть дизайна и установил упомянутые идентификаторы в графическом редакторе Eclipse, поэтому код, который приводил к сообщению об ошибке, был автоматически вставлен. Может это ошибка в Eclipse.

Stemadsen
источник

Ответы:

77

Пожалуйста, проверьте приведенный ниже код

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

Также проверьте следующую ссылку . В нем говорится, что android: layout_below = "@ id / myTextView" не распознает элемент с идентификатором "myTextView", если он написан после элемента, в котором вы его используете.

Шрикант
источник
8
Спасибо за этот комментарий: android: layout_below = "@ id / myTextView" не распознает элемент с идентификатором "myTextView", если он написан после элемента, в котором вы его используете . Это устранило проблему, хотя мне кажется смешным, что вы должны писать элементы в «правильном» порядке ... Возможно, это ошибка.
STEMADSEN
4
Наверняка это ошибка. Идентификаторы макета не должны зависеть от порядка определения. Особенно досадно, что у экранного дизайнера макетов в Android Studio с этим нет проблем.
dodgy_coder
@stemadsen это не ошибка. parser просто создает представление и возвращает ссылку (Id) в первый раз, когда встречает элемент представления. вы ссылаетесь на непосещенный элемент. рассмотрим сценарий, который A определяет себя ниже B, а позже B определяет себя ниже A. ограничение порядка решает логическую проблему
Масуд Дадаши
Позвольте мне здесь отметить: невозможно сделать ссылки на элемент пользовательского интерфейса, над которым вы работаете, для элементов пользовательского интерфейса, написанных ПОСЛЕ этого (не раньше).
ivanleoncz
85

изменение

@id/LinearLayout_acc

к

@+id/LinearLayout_acc
джит
источник
3
Вау, это действительно работает. Я думал, что это нужно @id/для ссылки на существующие идентификаторы, @+id/для создания новых идентификаторов, и что они не могут быть заменены. Почему такой подход законен? Значит, я определяю id дважды?
stemadsen
на самом деле это длинное значение для id, @ + id / относится к некоторому длинному значению. и если мы присвоили некоторое значение идентификатора какому-либо компоненту, то мы можем использовать только этот идентификатор для ссылки на представления.
jeet
Это звучит странно, потому что во всех других макетах я ссылаюсь на другие идентификаторы с помощью @ id /, а не @ + id /. Кроме того, как заметил ниже Шрикант, если я изменю порядок элементов, на которые ссылаются, он будет работать с @ id /.
Stamadsen
1
Действительно хороший способ сохранить элементы в относительном макете в том порядке, в котором они будут отображаться на экране, именно то, что я искал.
GLee
2
ДА СЭР! Дайте этому человеку медаль. Это именно то, что вам нужно сделать, если необходимо ссылаться на представление, которое создается позже в макете.
Йорако Гонсалес
15

Измените каждый идентификатор @idна @+id, независимо от того, определяет ли он идентификатор или ссылается на него. С этим вы не получите

Ошибка Android xml: «Ресурс не найден, соответствующий заданному имени» с RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

АкашГ
источник
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" >
Хардик Надияпара
источник