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

84

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

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

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

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

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

и ту же ошибку для другого линейного макета, ссылающегося на индикатор выполнения. У меня есть более чем трижды проверено, что нет опечаток (id также существует в 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>

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

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

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

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

Теги:

4 ответа

73
Лучший ответ

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

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

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

  • 8
    Спасибо за этот комментарий: android: layout_below = "@ id / myTextView" не распознает элемент с идентификатором "myTextView", если он записан после того элемента, в котором вы его используете . Это решило проблему, хотя я думаю, что это нелепо, что вы должны писать элементы в «правильном» порядке ... Возможно, ошибка.
  • 4
    Наверняка это ошибка. Идентификаторы макета должны быть независимы от порядка определения. Особенно досадно, что экранный дизайнер макетов в Android Studio не имеет с этим проблем.
Показать ещё 3 комментария
85

изменить

@id/LinearLayout_acc

to

@+id/LinearLayout_acc
  • 3
    Вау, это на самом деле работает. Я думал, что @id/ для ссылки на существующие идентификаторы, @+id/ для создания новых идентификаторов, и что они не могут быть заменены. Почему такой подход является законным? Я определяю идентификатор дважды тогда?
  • 0
    на самом деле, это длинное значение для id, @ + id / относится к некоторому длинному значению. и если мы присвоили некоторое значение идентификатора некоторому компоненту, то мы можем использовать только этот идентификатор для ссылки на представления.
Показать ещё 3 комментария
12

Измените каждый id @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" >

Ещё вопросы

Сообщество Overcoder
Наверх
Меню