Errore xml Android: "Nessuna risorsa trovata che corrisponda al nome specificato" con RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)


92

Ok, quindi questo inizia a infastidirmi davvero. Questo errore si presenta in un modo molto speciale, non molto logico.

Vorrei iniziare dicendo che ho già esaminato le altre domande su questo errore, anche su Google. Per quanto posso dire, problemi più simili si verificano perché la gente si riferisce a una Stringrisorsa o qualcos'altro non all'interno dello stesso file di layout, che smarrire il '+' a '@ id +' o qualcosa di simile.

Il problema che sto riscontrando si verifica in un file .xml di layout con estensione RelativeLayout. Questo contiene una TableLayout, due LinearLayouts contenenti un testo e, infine, un ProgressBar. Quello che voglio è che la barra di avanzamento sia allineata con il layout relativo utilizzando android:layout_alignParentBottom="true"e quindi allineare i due layout lineari sopra la barra di avanzamento (il layout lineare inferiore allineato sopra la barra di avanzamento, l'altro allineato sopra il layout lineare inferiore).

Dovrebbe essere abbastanza semplice e sembra che funzioni, ovvero la visualizzazione grafica mostra il risultato desiderato. Tuttavia, e qui arriva il problema , Eclipse mi dà un errore sui due layout lineari,

"Errore: nessuna risorsa trovata che corrisponde al nome specificato (in" layout_above "con valore" @ id / LinearLayout_acc ")."

e lo stesso errore per l'altro layout lineare riferito alla barra di avanzamento. Ho controllato più di tre volte che non ci siano errori di battitura (gli ID esistono anche in packagename.R.java), e ho provato a pulire il progetto una dozzina di volte.

Non ricevo l'errore durante il salvataggio (e la creazione automatica), non finché non decido di eseguire il progetto. Un'altra cosa strana è che quando mi riferisco al layout lineare inferiore dalla barra di avanzamento anziché al layout lineare superiore, non ottengo alcun errore!

Il mio file di layout:

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

Per favore aiuto, non ho idea di cosa causi questo errore!

Modifica con le risposte

Shrikant è arrivato con la soluzione di cambiare l'ordine di apparizione nel file di layout in modo che gli elementi facciano riferimento solo ad altri elementi già definiti quando il riferimento viene letto.
Inoltre, come altri hanno pubblicato, il passaggio @id/a @+id/, anche in un riferimento, rimuove i messaggi di errore. Come ha scritto Marco W. in questo thread, il fatto è che devi usare @+id/la prima volta che ogni id viene menzionato e poi usarlo in @id/seguito, anche se la prima volta potrebbe non essere una definizione.

Ho realizzato la maggior parte del design e impostato gli ID di riferimento nell'editor grafico di Eclipse, quindi il codice che ha generato un messaggio di errore è stato inserito automaticamente. Forse questo è un bug in Eclipse.

Risposte:


77

Si prega di controllare il codice sottostante

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

Controlla anche il seguente link . Dice che android: layout_below = "@ id / myTextView" non riconoscerà un elemento con id "myTextView" se è scritto dopo l'elemento in cui lo stai utilizzando.


8
Grazie per questo commento: android: layout_below = "@ id / myTextView" non riconoscerà un elemento con ID "myTextView" se è scritto dopo l'elemento in cui lo stai utilizzando . Questo ha risolto il problema, anche se penso sia ridicolo che tu debba scrivere gli elementi nell'ordine "corretto" ... Forse un bug.
stemadsen

4
Di sicuro questo è un bug. Gli ID layout dovrebbero essere indipendenti dall'ordine di definizione. Particolarmente fastidioso che il designer del layout su schermo in Android Studio non abbia problemi con esso.
dodgy_coder

@stemadsen non è un bug. parser crea semplicemente la vista e la sua refrences (Id) la prima volta che incontra l'elemento view. stai facendo riferimento a un elemento non visitato. si consideri uno scenario che A si definisce al di sotto di B e successivamente B si definisce al di sotto di A. la limitazione dell'ordinamento risolve il problema logico
Masoud Dadashi

Lasciatemi notare qui: non è possibile fare riferimenti all'elemento dell'interfaccia utente su cui si sta lavorando per gli elementi dell'interfaccia utente scritti DOPO (non prima).
ivanleoncz

85

modificare

@id/LinearLayout_acc

per

@+id/LinearLayout_acc

3
Wow, funziona davvero. Pensavo @id/fosse per fare riferimento a ID esistenti, @+id/per creare nuovi ID e che questi non potessero essere scambiati. Come mai questo approccio è legale? Allora definisco l'id due volte?
stemadsen

in realtà, è un valore lungo per id, @ + id / si riferisce a un valore lungo. e se abbiamo assegnato un valore id a qualche componente, allora possiamo usare solo questo id per fare riferimento alle viste.
jeet

Questo suona strano, perché in tutti gli altri layout faccio riferimento ad altri ID con @ id / e non con @ + id /. Inoltre, come Shrikant ha notato di seguito, se cambio l'ordine degli elementi di riferimento, funziona con @ id /.
stemadsen

1
Un modo davvero carino per mantenere gli elementi in un layout relativo nell'ordine in cui appariranno sullo schermo, esattamente quello che stavo cercando.
GLee

2
SI SIGNORE! Date una medaglia a quell'uomo. Questo è esattamente ciò che devi fare, se è necessario fare riferimento a una vista creata successivamente nel layout.
Yoraco Gonzales

15

Cambia ogni id @idin @+id, non importa quando definisce o fa riferimento a un id. Con questo, non otterrai

Errore xml Android: "Nessuna risorsa trovata che corrisponde al nome specificato" con 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" >
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.