Erreur XML Android: "Aucune ressource trouvée correspondant au nom donné" avec RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

D'accord, alors ça commence vraiment à m'ennuyer. Cette erreur apparaît d'une manière très spéciale, pas très logique.

Permettez-moi de commencer en disant que j'ai déjà examiné les autres questions concernant cette erreur, Google l'a également fait. Pour autant que je sache, la plupart des problèmes similaires se produisent parce que les gens se réfèrent à une Stringressource ou à quelque chose d'autre qui ne se trouve pas dans le même fichier de mise en page, ils égarent le «+» dans «@ id +» ou quelque chose de similaire.

Le problème que je rencontre se produit dans un fichier de mise en page .xml avec un RelativeLayout. Celui-ci contient un TableLayout, deux LinearLayouts contenant du texte et enfin un ProgressBar. Ce que je veux, c'est que la barre de progression soit alignée sur la disposition relative en utilisant android:layout_alignParentBottom="true", puis alignez les deux dispositions linéaires au-dessus de la barre de progression (la disposition linéaire inférieure s'alignant au-dessus de la barre de progression, l'autre alignant au-dessus de la disposition linéaire inférieure).

Il doit être assez simple et avoir l'air de fonctionner, c'est-à-dire que la vue graphique montre le résultat souhaité. Cependant, et voici le problème , Eclipse me donne une erreur sur les deux dispositions linéaires,

"Erreur: aucune ressource trouvée correspondant au nom donné (à 'layout_above' avec la valeur '@ id / LinearLayout_acc')."

et la même erreur pour l'autre mise en page linéaire se référant à la barre de progression. J'ai vérifié plus de trois fois qu'il n'y avait pas de fautes de frappe (les identifiants existent également dans packagename.R.java), et j'ai essayé de nettoyer le projet une douzaine de fois.

Je n'obtiens pas l'erreur lors de l'enregistrement (et de la construction automatique), pas avant que je décide d'exécuter le projet. Une autre chose étrange est que lorsque je fais référence à la disposition linéaire inférieure de la barre de progression au lieu de la disposition linéaire supérieure, je n'obtiens aucune erreur!

Mon fichier de mise en page:

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

Aidez-moi, je n'ai aucune idée de la cause de cette erreur!

Modifier avec des réponses

Shrikant est venu avec la solution de changer l'ordre d'apparition dans le fichier de mise en page afin que les éléments ne référencent que d'autres éléments déjà définis lors de la lecture de la référence.
De plus, comme d'autres l'ont publié, le passage @id/à @+id/, même dans une référence, supprime les messages d'erreur. Comme l'a écrit Marco W. dans ce fil, le fait est que vous devez utiliser @+id/la première fois que chaque identifiant est mentionné, puis l'utiliser @id/ensuite, même si la première fois n'est peut-être pas une définition.

J'ai fait l'essentiel de la conception et défini les identifiants référencés dans l'éditeur graphique d'Eclipse, de sorte que le code qui entraînait un message d'erreur était automatiquement inséré. C'est peut-être un bogue dans Eclipse.

Stemadsen
la source

Réponses:

77

Veuillez vérifier le code ci-dessous

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

Vérifiez également le lien suivant . Il indique que android: layout_below = "@ id / myTextView" ne reconnaîtra pas un élément avec l'ID "myTextView" s'il est écrit après l'élément dans lequel vous l'utilisez.

Shrikant
la source
8
Merci pour ce commentaire: android: layout_below = "@ id / myTextView" ne reconnaîtra pas un élément avec l'ID "myTextView" s'il est écrit après l'élément dans lequel vous l'utilisez . Cela a résolu le problème, même si je pense que c'est ridicule que vous deviez écrire les éléments dans le "bon" ordre ... Peut-être un bug.
stemadsen
4
C'est sûr qu'il s'agit d'un bug. Les ID de mise en page doivent être indépendants de l'ordre des définitions. Particulièrement ennuyeux que le concepteur de disposition à l'écran dans Android Studio n'ait aucun problème avec cela.
dodgy_coder
@stemadsen ce n'est pas un bug. l'analyseur crée simplement la vue et ses réfrences (Id) la première fois qu'il rencontre l'élément de vue. vous faites référence à un élément non visité. considérons un scénario que A se définit en dessous de B et plus tard B se définit en dessous de A. la limitation de la commande résout le problème logique
Masoud Dadashi
Laissez-moi faire une remarque ici: il n'est pas possible de faire des références sur l'élément d'interface utilisateur sur lequel vous travaillez pour les éléments d'interface utilisateur écrits APRÈS (pas avant).
ivanleoncz
85

changement

@id/LinearLayout_acc

à

@+id/LinearLayout_acc
jeet
la source
3
Wow, cela fonctionne réellement. Je pensais que @id/c'était pour faire référence aux identifiants existants, @+id/pour créer de nouveaux identifiants et que ceux-ci ne pouvaient pas être interchangés. Comment se fait-il que cette approche soit légale? Je définis l'id deux fois alors?
stemadsen
en fait, c'est une valeur longue pour id, @ + id / fait référence à une valeur longue. et si nous attribuons une valeur d'identifiant à un composant, alors nous ne pouvons utiliser que cet identifiant pour référencer les vues.
jeet
Cela semble étrange, car dans toutes les autres mises en page, je référence d'autres identifiants avec @ id / et non @ + id /. De plus, comme Shrikant l'a noté ci-dessous, si je change l'ordre des éléments référencés, cela fonctionne avec @ id /.
stemadsen
1
Très belle façon de conserver les éléments dans une mise en page relative dans l'ordre dans lequel ils apparaîtront à l'écran, exactement ce que je recherchais.
GLee
2
OUI MONSIEUR! Donnez une médaille à cet homme. C'est exactement ce que vous devez faire, s'il est nécessaire de référencer une vue créée ultérieurement dans la mise en page.
Yoraco Gonzales le
15

Remplacez chaque identifiant @idpar @+id, peu importe le moment où il définit ou référence un identifiant. Avec ça, vous n'obtiendrez pas

Erreur XML Android: "Aucune ressource trouvée correspondant au nom donné" avec RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

AkashG
la source
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
la source