Помилка 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')."

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

Відповіді:


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 це не помилка. синтаксичний аналізатор просто створює подання, і це посилання (Id), коли він вперше зустрічається з елементом подання. ви посилаєтесь на невідвіданий елемент. розглянемо сценарій, який A визначає себе нижче B, а пізніше B визначає себе нижче A. Обмеження впорядкування вирішує логічну проблему
Масуд Дадаші

Зазначу тут: неможливо зробити посилання на елемент інтерфейсу, над яким ви працюєте, для елементів інтерфейсу, написаних ПІСЛЯ нього (не раніше).
ivanleoncz

85

змінити

@id/LinearLayout_acc

до

@+id/LinearLayout_acc

3
Ого, це насправді працює. Я думав, що @id/це для посилання на існуючі ідентифікатори, @+id/для створення нових ідентифікаторів, і що вони не можуть бути змінені. Чому такий підхід легальний? Тоді я двічі визначаю ідентифікатор?
stemadsen

насправді, його довге значення для id, @ + id / відноситься до деякого довгого значення. і якщо ми призначили деяке значення id якомусь компоненту, то ми можемо використовувати лише цей id для посилання на подання.
jeet

Це звучить дивно, оскільки у всіх інших макетах я посилаюся на інші ідентифікатори з @ id /, а не @ + id /. Крім того, як зазначив Шрікант нижче, якщо я зміню порядок елементів, на які посилаються, це працює з @ id /.
stemadsen

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" >
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.