Ладно, это меня действительно начинает раздражать. Эта ошибка возникает особым, не очень логичным образом.
Позвольте мне начать с того, что я уже рассмотрел другие вопросы, касающиеся этой ошибки, и Google тоже. Насколько я могу судить, большинство подобных проблем возникает из-за того, что люди ссылаются на String
ресурс или что-то еще не в том же файле макета, они теряют '+' в '@ id +' или что-то подобное.
Проблема, с которой я столкнулся, возникает в файле макета .xml с расширением RelativeLayout
. Он содержит a TableLayout
, два LinearLayout
s, содержащие некоторый текст, и, наконец, 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.
изменение
к
источник
@id/
для ссылки на существующие идентификаторы,@+id/
для создания новых идентификаторов, и что они не могут быть заменены. Почему такой подход законен? Значит, я определяю id дважды?Измените каждый идентификатор
@id
на@+id
, независимо от того, определяет ли он идентификатор или ссылается на него. С этим вы не получитеисточник
<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" >
источник