Lỗi xml của Android: “Không tìm thấy tài nguyên nào khớp với tên đã cho” với RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)


92

Được rồi, vì vậy điều này bắt đầu thực sự làm phiền tôi. Lỗi này xuất hiện một cách rất đặc biệt, không hợp lý lắm.

Hãy để tôi bắt đầu bằng cách nói rằng tôi đã xem xét các câu hỏi khác liên quan đến lỗi này, Google cũng vậy. Theo như tôi có thể nói, hầu hết các vấn đề tương tự xảy ra bởi vì mọi người tham chiếu đến một Stringtài nguyên hoặc thứ gì đó khác không nằm trong cùng một tệp bố cục, họ đặt sai dấu '+' trong '@ id +' hoặc thứ gì đó tương tự.

Sự cố tôi đang gặp phải xảy ra trong tệp .xml có bố cục với RelativeLayout. Điều này chứa a TableLayout, hai LinearLayouts chứa một số văn bản và cuối cùng là a ProgressBar. Điều tôi muốn là thanh tiến trình được căn chỉnh với bố cục tương đối bằng cách sử dụng android:layout_alignParentBottom="true"và sau đó căn chỉnh hai bố cục tuyến tính phía trên thanh tiến trình (bố cục tuyến tính phía dưới căn chỉnh phía trên thanh tiến trình, bố cục còn lại căn chỉnh phía trên bố cục tuyến tính phía dưới).

Nó phải đủ đơn giản và trông như thể nó hoạt động, tức là chế độ xem đồ họa hiển thị kết quả mong muốn. Tuy nhiên, và đây là vấn đề , Eclipse cho tôi một lỗi trên hai bố cục tuyến tính,

"Lỗi: Không tìm thấy tài nguyên nào khớp với tên đã cho (tại 'layout_above' với giá trị '@ id / LinearLayout_acc')."

và lỗi tương tự đối với bố cục tuyến tính khác tham chiếu đến thanh tiến trình. Tôi đã kiểm tra hơn ba lần rằng không có lỗi chính tả nào (id cũng tồn tại trong packagename.R.java) và tôi đã thử làm sạch dự án hàng chục lần.

Tôi không gặp lỗi khi lưu (và xây dựng tự động), cho đến khi tôi quyết định chạy dự án. Một điều kỳ lạ khác là khi tôi tham chiếu đến bố cục tuyến tính dưới cùng từ thanh tiến trình thay vì bố trí tuyến tính trên cùng, tôi không gặp lỗi!

Tệp bố cục của tôi:

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

Xin hãy giúp đỡ, tôi không biết điều gì gây ra lỗi này!

Chỉnh sửa bằng câu trả lời

Shrikant đến với giải pháp thay đổi thứ tự xuất hiện trong tệp bố cục để các phần tử chỉ tham chiếu đến các phần tử khác đã được xác định khi tham chiếu được đọc.
Ngoài ra, như những người khác đã đăng, việc thay đổi @id/thành @+id/, ngay cả trong một tham chiếu, sẽ xóa các thông báo lỗi. Như Marco W. đã viết trong chủ đề này, vấn đề là bạn phải sử dụng @+id/lần đầu tiên mỗi id được đề cập và sau đó sử dụng @id/sau đó, mặc dù lần đầu tiên có thể không phải là định nghĩa.

Tôi đã thực hiện hầu hết thiết kế và đặt id được giới thiệu trong trình soạn thảo đồ họa của Eclipse, vì vậy mã dẫn đến thông báo lỗi được tự động chèn vào. Có thể đây là một lỗi trong Eclipse.

Câu trả lời:


77

Vui lòng kiểm tra mã bên dưới

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

Cũng kiểm tra liên kết sau . Nó nói rằng android: layout_below = "@ id / myTextView" sẽ không nhận ra một phần tử có id "myTextView" nếu nó được viết sau phần tử mà bạn đang sử dụng nó.


8
Cảm ơn nhận xét này: android: layout_below = "@ id / myTextView" sẽ không nhận ra một phần tử có id "myTextView" nếu nó được viết sau phần tử mà bạn đang sử dụng nó . Điều này đã khắc phục sự cố, mặc dù tôi nghĩ thật nực cười khi bạn phải viết các phần tử theo thứ tự "đúng" ... Có thể là một lỗi.
stemadsen

4
Chắc chắn đây là một lỗi. ID bố cục phải độc lập với thứ tự định nghĩa. Đặc biệt khó chịu là trình thiết kế bố cục trên màn hình trong Android Studio không gặp khó khăn gì với nó.
dodgy_coder

@stemadsen nó không phải là một lỗi. phân tích cú pháp chỉ đơn giản là tạo chế độ xem và nó tái tạo (Id) lần đầu tiên nó gặp phần tử chế độ xem. bạn đang tham chiếu đến một phần tử không được truy cập. xem xét một kịch bản đó A xác định mình dưới B và B định nghĩa sau thân dưới đây A. giới hạn phá được đặt vấn đề logic
Masoud Dadashi

Hãy để tôi nhận xét ở đây: không thể tạo tham chiếu về phần tử giao diện người dùng mà bạn đang làm việc cho các phần tử giao diện người dùng được viết SAU nó (không phải trước đó).
ivanleoncz

85

thay đổi

@id/LinearLayout_acc

đến

@+id/LinearLayout_acc

3
Wow, điều này thực sự hiệu quả. Tôi nghĩ @id/là để tham khảo id hiện có, @+id/để tạo id mới và chúng không thể thay thế cho nhau. Làm thế nào để cách tiếp cận này là hợp pháp? Tôi xác định id hai lần sau đó?
stemadsen, 26/07/12

trên thực tế, nó là một giá trị dài cho id, @ + id / đề cập đến một số giá trị dài. và nếu chúng tôi đã gán một số giá trị id cho một số thành phần, thì chúng tôi chỉ có thể sử dụng id này để tham chiếu các chế độ xem.
jeet

Điều này nghe có vẻ lạ, bởi vì trong tất cả các bố cục khác, tôi tham chiếu các id khác bằng @ id / chứ không phải @ + id /. Ngoài ra, như Shrikant đã lưu ý bên dưới, nếu tôi thay đổi thứ tự của các phần tử được tham chiếu, nó sẽ hoạt động với @ id /.
stemadsen,

1
Một cách thực sự hay để giữ các phần tử trong một Bố cục Tương đối theo thứ tự chúng sẽ xuất hiện trên màn hình, chính xác những gì tôi đang tìm kiếm.
GLee

2
VÂNG THƯA NGÀI! Hãy trao Huân chương cho anh ấy. Đây chính xác là những gì bạn phải làm, nếu cần tham chiếu đến Chế độ xem được tạo sau này trong bố cục.
Yoraco Gonzales

15

Thay đổi mọi id @idthành @+id, bất kể khi nó đang định nghĩa hoặc tham chiếu đến một id. Với điều này, bạn sẽ không nhận được

Lỗi xml của Android: “Không tìm thấy tài nguyên nào khớp với tên đã cho” với 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" >
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.