Android xml错误:带有RelativeLayout(@ id / LinearLayout_acc,@ id / ProgressBar_statusScreen)的“找不到与给定名称匹配的资源”


92

好的,这开始让我很烦。该错误会以一种非常特殊的方式弹出,而不是非常合乎逻辑的方式。

首先,我要说的是,我已经查看了有关此错误的其他问题,Google也这样做了。据我所知,大多数类似问题的发生是因为人们引用了String资源或不在同一布局文件中的其他内容,他们将'+'放置在'@ id +'或类似内容中。

我的问题出现在带有RelativeLayout。的layout .xml文件中。其中包含一个TableLayout,两个LinearLayout包含一些文本,最后一个ProgressBar。我想要的是将进度条与使用的相对布局android:layout_alignParentBottom="true"对齐,然后将进度条上方的两个线性布局对齐(底部线性布局在进度条上方对齐,另一个在底部线性布局上方对齐)。

它应该足够简单,看起来好像可行,即图形视图显示所需的结果。但是,问题来了,Eclipse在两个线性布局上给了我一个错误,

“错误:找不到与给定名称匹配的资源(在'layout_above,值为'@ id / LinearLayout_acc')。”

以及其他线性布局的相同错误(请参考进度条)。我已经检查了三次以上,确认没有错别字(在packagename.R.java中也存在ID),并且我已经尝试过多次清理项目。

保存(和自动构建)时不会出现错误,除非我决定运行该项目。另一个怪异的事情是,当我从进度条引用底部的线性布局而不是顶部的线性布局时,我没有任何错误!

我的布局文件:

<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/,确实会删除错误消息。正如Marco W.在线程中所写的,事情是,即使第一次可能不是定义,您也必须@+id/第一次使用每个id,然后再使用@id/

我完成了大部分设计,并在Eclipse的图形编辑器中设置了引用的ID,因此会自动插入导致错误消息的代码。也许这是Eclipse中的错误。

Answers:


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”不会识别ID为“ myTextView”的元素,如果该元素是在您正在使用它的元素之后编写的。


8
感谢您的评论:android:layout_below =“ @ id / myTextView”将无法识别ID为“ myTextView”的元素,前提是该元素是在您在其中使用的元素之后编写的。即使我认为必须以“正确”的顺序编写元素是荒谬的,这也解决了问题。可能是一个错误。
stemadsen,2012年

4
当然,这是一个错误。布局ID应独立于定义顺序。尤其令人烦恼的是,Android Studio中的屏幕布局设计器没有遇到任何麻烦。
dodgy_coder 2015年

@stemadsen,这不是错误。解析器仅创建视图,并且在遇到视图元素时即为参考(Id)。您引用的是未访问元素。考虑一个场景,其中A定义自己低于B,之后B定义自己低于A。顺序的限制解决了逻辑问题
Masoud Dadashi

让我在这里说明一下:对于在此之后(而不是之前)编写的UI元素,无法在您正在使用的UI元素上进行引用。
ivanleoncz

85

更改

@id/LinearLayout_acc

@+id/LinearLayout_acc

3
哇,这确实有效。我以为@id/是引用现有的ID,@+id/创建新的ID,并且这些ID 无法互换。这种方法为什么合法?然后我两次定义ID?
stemadsen

实际上,它的id长值@ + id /表示某个长值。如果我们为某些组件分配了ID值,那么我们只能使用该ID来引用视图。
jeet 2012年

这听起来很奇怪,因为在所有其他布局中,我使用@ id /而不是@ + id /来引用其他ID。另外,如下文Shrikant所述,如果我更改了引用元素的顺序,则它可以与@ id /一起使用。
stemadsen 2012年

1
将元素按在屏幕上出现的顺序保持在相对布局中的一种非常不错的方法,正是我想要的。
GLee

2
是的先生!给那个人一块奖牌。如果需要引用稍后在布局中创建的View,这正是您必须执行的操作。
Yoraco Gonzales

15

不论何时定义或引用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" >
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.