ข้อผิดพลาด xml ของ Android:“ ไม่พบทรัพยากรที่ตรงกับชื่อที่กำหนด” กับ RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)


92

โอเคนี่เริ่มรบกวนฉันจริงๆ ข้อผิดพลาดนี้ปรากฏขึ้นในลักษณะพิเศษไม่ใช่เชิงตรรกะ

ให้ฉันเริ่มต้นด้วยการบอกว่าฉันได้ดูคำถามอื่น ๆ เกี่ยวกับข้อผิดพลาดนี้แล้ว Google ก็เช่นกัน เท่าที่ฉันสามารถบอกได้ปัญหาที่คล้ายกันส่วนใหญ่เกิดขึ้นเนื่องจากผู้คนอ้างถึงStringทรัพยากรหรือสิ่งอื่นที่ไม่อยู่ในไฟล์เลย์เอาต์เดียวกันพวกเขาใส่ '+' ใน '@ id +' ผิดหรือสิ่งที่คล้ายกัน

ปัญหาที่ฉันพบเกิดขึ้นในไฟล์รูปแบบ. xml ที่มีไฟล์RelativeLayout. ซึ่งประกอบด้วย a TableLayout, สองLinearLayouts ที่มีข้อความบางส่วนและสุดท้าย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>

โปรดช่วยฉันไม่รู้ว่าอะไรทำให้เกิดข้อผิดพลาดนี้!

แก้ไขด้วยคำตอบ

Shrikant มาพร้อมกับวิธีแก้ปัญหาในการเปลี่ยนลำดับการปรากฏในไฟล์เค้าโครงเพื่อให้องค์ประกอบอ้างอิงเฉพาะองค์ประกอบอื่น ๆ ที่กำหนดไว้แล้วเมื่ออ่านข้อมูลอ้างอิง
นอกจากนี้ในขณะที่คนอื่นโพสต์การเปลี่ยน@id/เป็น@+id/แม้ในข้อมูลอ้างอิงจะเป็นการลบข้อความแสดงข้อผิดพลาด ตามที่ Marco W. เขียนไว้ในเธรดนี้สิ่งนี้คือคุณต้องใช้@+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" จะไม่รู้จักองค์ประกอบที่มี id "myTextView" ถ้ามันเขียนตามหลังองค์ประกอบที่คุณใช้อยู่


8
ขอบคุณสำหรับความคิดเห็นนี้: หุ่นยนต์: layout_below = "@ ID / myTextView" จะไม่รับรู้องค์ประกอบที่มี ID "myTextView" ถ้ามันถูกเขียนขึ้นหลังจากองค์ประกอบที่คุณกำลังใช้มันใน วิธีนี้แก้ไขปัญหาได้แม้ว่าฉันคิดว่ามันไร้สาระที่คุณต้องเขียนองค์ประกอบตามลำดับ "ที่ถูกต้อง" ...
stemadsen

4
แน่นอนว่านี่เป็นข้อบกพร่อง รหัสโครงร่างควรเป็นอิสระจากลำดับความหมาย น่ารำคาญอย่างยิ่งที่ผู้ออกแบบโครงร่างบนหน้าจอใน Android Studio ไม่มีปัญหากับมัน
dodgy_coder

@stemadsen ไม่ใช่บั๊ก parser จะสร้างมุมมองและการอ้างอิง (Id) ในครั้งแรกที่ตรงกับองค์ประกอบมุมมอง คุณกำลังอ้างถึงองค์ประกอบที่ไม่ได้เข้าชม พิจารณาสถานการณ์ที่ A กำหนดตัวเองต่ำกว่า B และต่อมา B กำหนดตัวเองต่ำกว่า A ข้อ จำกัด ในการสั่งซื้อช่วยแก้ปัญหาเชิงตรรกะ
Masoud Dadashi

ให้ฉันสังเกตที่นี่: ไม่สามารถทำการอ้างอิงในองค์ประกอบ UI ที่คุณกำลังทำงานอยู่สำหรับองค์ประกอบ UI ที่เขียนหลังจากนั้น (ไม่ใช่ก่อนหน้านี้)
ivanleoncz

85

เปลี่ยนแปลง

@id/LinearLayout_acc

ถึง

@+id/LinearLayout_acc

3
ว้าวมันใช้งานได้จริง ฉันคิดว่า@id/มีไว้เพื่ออ้างอิงรหัสที่มีอยู่@+id/สำหรับการสร้างรหัสใหม่และสิ่งเหล่านี้ไม่สามารถแลกเปลี่ยนกันได้ วิธีนี้ถูกกฎหมายอย่างไร? ฉันกำหนด id สองครั้งแล้ว?
stemadsen

จริงๆแล้วมันเป็นค่าที่ยาวสำหรับ id, @ + id / หมายถึงค่า long และหากเรากำหนดค่า id บางส่วนให้กับส่วนประกอบบางอย่างเราสามารถใช้เฉพาะ id นี้เพื่ออ้างอิงมุมมอง
jeet

ฟังดูแปลก ๆ เพราะในรูปแบบอื่น ๆ ฉันอ้างอิง id อื่นด้วย @ id / ไม่ใช่ @ + id / นอกจากนี้ตามที่ Shrikant ระบุไว้ด้านล่างหากฉันเปลี่ยนลำดับขององค์ประกอบที่อ้างอิงจะใช้งานได้กับ @ id /
stemadsen

1
วิธีที่ดีมากในการเก็บองค์ประกอบไว้ในเค้าโครงสัมพัทธ์ตามลำดับที่จะปรากฏบนหน้าจอตรงตามที่ฉันต้องการ
GLee

2
ครับท่าน! มอบเหรียญให้ชายคนนั้น นี่คือสิ่งที่คุณต้องทำหากจำเป็นต้องอ้างอิงมุมมองที่สร้างขึ้นในเค้าโครงในภายหลัง
Yoraco Gonzales

15

เปลี่ยนรหัสทุก@idการ@+idไม่ว่าเมื่อมีการกำหนดหรืออ้างอิงรหัส ด้วยสิ่งนี้คุณจะไม่ได้รับ

ข้อผิดพลาด xml ของ Android:“ ไม่พบทรัพยากรที่ตรงกับชื่อที่กำหนด” กับ RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.