Kesalahan Android xml: “Tidak ada sumber daya yang cocok dengan nama yang diberikan” dengan RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

Oke, jadi ini mulai sangat mengganggu saya. Kesalahan ini muncul dengan cara yang sangat khusus, tidak terlalu logis.

Izinkan saya memulai dengan mengatakan bahwa saya telah melihat pertanyaan lain tentang kesalahan ini, juga di Google. Sejauh yang saya tahu, sebagian besar masalah serupa terjadi karena orang merujuk ke Stringsumber daya atau sesuatu yang lain yang tidak berada dalam file tata letak yang sama, mereka salah menempatkan '+' di '@ id +' atau yang serupa.

Masalah yang saya alami terjadi pada file .xml layout dengan RelativeLayout. Ini berisi a TableLayout, dua LinearLayouts berisi beberapa teks dan akhirnya a ProgressBar. Yang saya inginkan adalah bilah kemajuan disejajarkan dengan tata letak relatif menggunakan android:layout_alignParentBottom="true"dan kemudian sejajarkan dua tata letak linier di atas bilah kemajuan (tata letak linier bawah sejajar di atas bilah kemajuan, perataan lainnya di atas tata letak linier bawah).

Ini harus cukup sederhana dan terlihat seperti berfungsi, yaitu tampilan grafik menunjukkan hasil yang diinginkan. Namun, dan inilah masalahnya , Eclipse memberi saya kesalahan pada dua tata letak linier,

"Kesalahan: Tidak ditemukan sumber daya yang cocok dengan nama yang diberikan (di 'layout_above' dengan nilai '@ id / LinearLayout_acc')."

dan kesalahan yang sama untuk tata letak linier lainnya yang mengacu pada bilah kemajuan. Saya telah memeriksa lebih dari tiga kali bahwa tidak ada kesalahan ketik (id juga ada di nama paket.R.java), dan saya telah mencoba membersihkan proyek belasan kali.

Saya tidak mendapatkan kesalahan saat menyimpan (dan membangun otomatis), tidak sampai saya memutuskan untuk menjalankan proyek. Hal aneh lainnya adalah ketika saya merujuk ke tata letak linier bawah dari bilah kemajuan alih-alih tata letak linier atas, saya tidak mendapatkan kesalahan!

File tata letak saya:

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

Tolong bantu, saya tidak tahu apa yang menyebabkan kesalahan ini!

Edit dengan jawaban

Shrikant hadir dengan solusi untuk mengubah urutan tampilan di file tata letak sehingga elemen hanya mereferensikan elemen lain yang sudah ditentukan saat referensi dibaca.
Selain itu, seperti yang telah diposting orang lain, mengubah @id/ke @+id/, bahkan dalam sebuah referensi, memang menghapus pesan kesalahan. Seperti yang ditulis Marco W. di thread ini , masalahnya adalah Anda harus menggunakan @+id/pertama kali setiap id disebutkan dan kemudian digunakan @id/setelahnya, meskipun yang pertama mungkin bukan definisi.

Saya membuat sebagian besar desain dan mengatur id yang dirujuk di editor grafis Eclipse, sehingga kode yang menghasilkan pesan kesalahan secara otomatis dimasukkan. Mungkin ini bug di Eclipse.

stemadsen.dll
sumber

Jawaban:

77

Silakan periksa kode di bawah ini

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

Cek juga link berikut ini . Dikatakan bahwa android: layout_below = "@ id / myTextView" tidak akan mengenali elemen dengan id "myTextView" jika ditulis setelah elemen tempat Anda menggunakannya.

Shrikant
sumber
8
Terima kasih atas komentar ini: android: layout_below = "@ id / myTextView" tidak akan mengenali elemen dengan id "myTextView" jika ditulis setelah elemen tempat Anda menggunakannya . Ini memperbaiki masalah, meskipun menurut saya konyol bahwa Anda harus menulis elemen dalam urutan "benar" ... Mungkin bug.
stemadsen
4
Yang pasti ini bug. ID tata letak harus independen dari urutan definisi. Sangat menjengkelkan karena perancang tata letak layar di Android Studio tidak mengalami masalah dengannya.
dodgy_coder
@stemadsen ini bukan bug. parser hanya membuat tampilan dan refence (Id) itu pertama kali bertemu dengan elemen tampilan. Anda mereferensikan elemen yang tidak dikunjungi. pertimbangkan skenario yang A mendefinisikan dirinya sendiri di bawah B dan kemudian B mendefinisikan dirinya sendiri di bawah A. batasan pemesanan memecahkan masalah logis
Masoud Dadashi
Izinkan saya berkomentar di sini: tidak mungkin membuat referensi tentang elemen UI yang sedang Anda kerjakan untuk elemen UI yang ditulis SETELAH itu (bukan sebelumnya).
ivanleoncz
85

perubahan

@id/LinearLayout_acc

untuk

@+id/LinearLayout_acc
jeet
sumber
3
Wow, ini benar-benar berhasil. Saya pikir @id/itu untuk mereferensikan id yang ada, @+id/untuk membuat id baru dan ini tidak dapat dipertukarkan. Kenapa pendekatan ini legal? Saya mendefinisikan id dua kali?
stemadsen
sebenarnya, ini adalah nilai panjang untuk id, @ + id / mengacu pada beberapa nilai panjang. dan jika kita menetapkan beberapa nilai id ke beberapa komponen, maka kita hanya dapat menggunakan id ini untuk mereferensikan tampilan.
jeet
Ini terdengar aneh, karena di semua tata letak lain saya merujuk id lain dengan @ id / dan bukan @ + id /. Juga, seperti yang dicatat Shrikant di bawah ini, jika saya mengubah urutan elemen yang direferensikan, ini bekerja dengan @ id /.
stemadsen
1
Cara yang sangat bagus untuk menyimpan elemen dalam Tata Letak Relatif dalam urutan kemunculannya di layar, persis seperti yang saya cari.
GLee
2
YA PAK! Beri orang itu medali. Inilah yang harus Anda lakukan, jika diperlukan untuk mereferensikan Tampilan yang dibuat nanti dalam tata letak.
Yoraco Gonzales
15

Ubah setiap id @idmenjadi @+id, tidak peduli kapan itu mendefinisikan atau mereferensikan sebuah id. Dengan ini, Anda tidak akan mendapatkannya

Kesalahan Android xml: "Tidak ada sumber daya yang cocok dengan nama yang diberikan" dengan RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

AkashG
sumber
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" >
Hardik Nadiyapara
sumber