Différence entre «@ id /» et «@ + id /» dans Android

456

Quelle est la différence entre le @id/et @+id/?

Dans @+id/le symbole plus, vous devez +créer un nouveau nom de ressource et l'ajouter au R.javafichier, mais qu'en est-il @id/? Dans la documentation de ID: lors du référencement d'une ressource Android ID, vous n'avez pas besoin du symbole plus, mais vous devez ajouter l'espace de noms du package android, comme ceci:

android:id="@android:id/list"

Mais dans l'image ci-dessous, Eclipse ne suggère aucun type de @android:id/.

Image montrant la suggestion de @ / id et @ + / id

Sont @id/et @android:id/les mêmes?

Vikas Patidar
la source
De la documentation Android: (il a fallu une éternité pour trouver cela, et je cherchais un problème sans rapport) developer.android.com/guide/topics/resources/…
Juan Bonfante

Réponses:

351

vous vous référez Android resources, qui sont déjà définis dans le système Android, avec @android:id/..pour accéder aux ressources que vous avez définies / créées dans votre projet, vous utilisez@id/..

Plus d'informations

Selon vos clarifications dans le chat, vous avez dit que vous aviez un problème comme celui-ci:

Si nous l'utilisons, android:id="@id/layout_item_id"cela ne fonctionne pas. Au lieu de cela @+id/fonctionne, quelle est la différence ici? Et c'était ma question initiale.

Eh bien, cela dépend du contexte, lorsque vous utilisez l'attribut XML de android:id, vous spécifiez un nouvel identifiant et demandez à l'analyseur (ou appelez-le le générateur) de créer une nouvelle entrée dans R.java, vous devez donc inclure un +signe.

Alors que dans l'autre cas, android:layout_below="@id/myTextView"vous faites référence à un identifiant qui a déjà été créé, donc l'analyseur le relie à l'identifiant déjà créé dansR.java .

Encore plus d'informations

Comme vous l'avez dit dans votre discussion, notez que android:layout_below="@id/myTextView"ne reconnaîtra pas un élément avec id myTextViews'il est écrit après l'élément dans lequel vous l'utilisez.

Aman Alam
la source
142
Concernant le "Plus d'infos à nouveau": Vous pouvez définir la position avec android:layout_below="@+id/myTextView"et ALORS définir l'élément lui-même avec android:id="@id/myTextView".
caw
1
@MarcoW Cela m'a énormément aidé. J'avais du mal à trouver la solution à ce problème (ou plutôt à formuler la bonne entrée de recherche). Je suppose que cela mérite peut-être une question + une réponse qui lui est propre.
David Miler
Je vous remercie! J'ai eu le même problème, et la documentation ne dit pas grand-chose sur ce sujet. Mais c'est évident: le problème que nous avons eu ici n'est pas fréquent ...
caw
7
J'utilise toujours @ + id / sur android: id et android: layout_below, est-ce un problème?
melanke
4
@melanke: Mettre le +dans layout_belowainsi que android:idc'est très bien, car The '+' means to create the symbol if it doesn't already existcomme Tanmay Mandal l'a mentionné dans sa belle réponse (encore sous-estimée). Pour cette raison, il n'y a pas non plus d'effet négatif sur l'exécution (probablement une augmentation incommensurablement petite du temps de compilation si ^^).
Lévite
86

le signe + est un raccourci pour ajouter l'ID à votre liste d'ID de ressource. Sinon, vous devez les avoir dans un fichier xml comme celui-ci

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
Nathan Schwermann
la source
1
@schwiz: Et comment pouvons-nous l'utiliser dans notre mise en page?
Vikas Patidar
7
imaginez que vous avez le fichier de ressources que j'ai défini dans ma réponse, puis dans votre mise en page, vous pouvez avoir <View android:id="@id/my_logo"/> Si vous n'aviez pas le fichier de ressources que j'ai défini ci-dessus, vous devriez le faire comme <View android:id="@+id/my_logo"/> note: vous n'avez besoin de faire le + id qu'une seule fois donc si dans un autre fichier de mise en page, vous avez <View android: id = "+ id / my_logo" /> vous n'auriez pas besoin d'inclure le caractère '+' la prochaine fois que vous utiliserez le même id dans une mise en page.
Nathan Schwermann
@schwiz: D'accord, c'est utile, mais où devons-nous mettre ce fichier res/drawable/ou res/layout/ou res/values/et et quel sera le nom de ce fichier? Si vous avez un lien utile à ce sujet, veuillez poster ici.
Vikas Patidar
1
Voici tout ce que vous devez savoir sur les conventions de dénomination, etc. pour vos ressources. Vous mettriez le fichier dans res / values ​​/ et la convention est de le nommer ids mais vous pouvez l'appeler comme vous voulez. developer.android.com/guide/topics/resources/…
Nathan Schwermann
46

Parfois, vous voyez des références dans vos fichiers de mise en page comme:

<listview id="@+id/android:list">

et

<listview id="@android:id/list">

Quelle est la différence?

.. Je suis content que tu aies demandé ☺

@+id/foosignifie que vous créez un identifiant nommé foo dans l'espace de noms de votre application. Vous pouvez vous y référer en utilisant @id/foo. @android:id/foosignifie que vous faites référence à un identifiant défini dans l'espace de noms Android.

Le «+» signifie créer le symbole s'il n'existe pas déjà. Vous n'en avez pas besoin (et ne devez pas l'utiliser) lorsque vous référencez des symboles android: car ceux-ci sont déjà définis pour vous par la plate-forme et vous ne pouvez pas créer le vôtre dans cet espace de noms de toute façon.

Cet espace de noms est l'espace de noms du framework. par exemple, vous devez utiliser @android:id/listcar c'est l'identifiant que le framework s'attend à trouver .. (le framework ne connaît que les identifiants dans l'espace de noms Android.)

Entièrement copié à partir de cette source

Tanmay Mandal
la source
6
Whoosh !! Complétez CTRL + C puis CTRL + V. heureux que vous mettiez également une référence à l'article d'origine. c'est ton blog au fait?
Aman Alam
si j'ai déclaré dans la 1ère mise en page @ + id / mybutton de type Button, donc pas besoin de créer une nouvelle instance de if dans la 2ème mise en page juste utilisé comme @ id / mybutton. est ce juste ?
Hiren Dabhi
39

En bref

android:id="@+id/my_button"

Le signe + id Plus indique à Android d'ajouter ou de créer un nouvel identifiant dans les ressources.

tandis que

android:layout_below="@id/my_button"

il suffit de se référer à l'id déjà généré ..

Zar E Ahmer
la source
9

Le signe plus ( +) avant le type de ressource n'est nécessaire que lorsque vous définissez un ID de ressource pour la première fois. Lorsque vous compilez l'application, les outils du SDK utilisent le nom d'ID pour créer un nouvel ID de ressource dans le R.javafichier de votre projet qui fait référence à l' EditTextélément. Avec l'ID de ressource déclaré une fois de cette façon, les autres références à l'ID n'ont pas besoin du signe plus. L'utilisation du signe plus n'est nécessaire que lors de la spécification d'un nouvel ID de ressource et n'est pas nécessaire pour les ressources concrètes telles que les chaînes ou les dispositions. Voir l'encadré pour plus d'informations sur les objets ressources.

De: https://developer.android.com/training/basics/firstapp/building-ui.html

Nguyen
la source
6

Dans le Guide du développeur :

android:id="@+id/my_button"

Le symbole at ( @) au début de la chaîne indique que l'analyseur XML doit analyser et développer le reste de la chaîne ID et l'identifier comme une ressource ID. Le signe plus ( +) signifie qu'il s'agit d'un nouveau nom de ressource qui doit être créé et ajouté à nos ressources (dans le R.javafichier). Il existe un certain nombre d'autres ressources d'identification offertes par le cadre Android. Lorsque vous référencez un ID de ressource Android, vous n'avez pas besoin du symbole plus, mais vous devez ajouter l' androidespace de noms du package, comme ceci:

android:id="@android:id/empty"

Jeff Axelrod
la source
4

Il y a un bug avec Eclipse où parfois si vous venez de créer un nouveau @+id/.. , il ne sera pas ajouté immédiatement au fichier R.java, même après avoir nettoyé le projet. La solution est de redémarrer Eclipse.

Je pense que cela devrait être résolu dès que possible, car cela peut (et par expérience, va) confondre certains développeurs en pensant qu'il y a quelque chose de mal dans leur syntaxe, et essayer de le déboguer même s'il n'y a vraiment rien à déboguer.

josephus
la source
3
L'une des raisons pour lesquelles je suis passé à Android Studio et que je n'ai jamais regardé en arrière :) (je sais qu'il n'était pas encore là au moment où vous avez écrit votre réponse)
Konrad Morawski
4

Android utilise certains fichiers appelés ressources où les valeurs sont stockées pour les fichiers XML.

Maintenant, lorsque vous utilisez @ id / pour un objet XML, il essaie de faire référence à un identifiant déjà enregistré dans les fichiers de valeurs. D'un autre côté, lorsque vous utilisez @ + id / il enregistre un nouvel identifiant dans les fichiers de valeurs comme l'indique le symbole '+'.

J'espère que cela t'aides :).

Tanuj Nayak
la source
4

@id/et ce @android:id/n'est pas pareil.

@id/référençant l'ID dans votre application, @android:id/référençant un élément dans la plateforme Android.

Eclipse a tort.

Olegas
la source
Vous dites que @id/ referencing ID in your applicationMais eclise donne Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')quand nous l'utilisons pour référencer la ressource d'application. Alors, quelle est la différence entre le @id/et le @+id/? Comment pourriez-vous dire que l'éclipse est fausse?
Vikas Patidar
1
Eclipse a tort en cas de ne pas vous montrer une suggestion @android: id. Et vous vous trompez, si vous utilisez @ id / myId sans le déclarer avec @ + id / myId quelque part. Tous les @ id / xxx doivent être déclarés quelque part dans votre application en utilisant @ + id / xxx.
Olegas
Merci pour la clarification. Je pense qu'ici, l'éclipse ne se trompe pas, elle montre une suggestion basée sur le contexte de nos éléments de mise en page. Comme il @id/ne s'affiche qu'en cas deRelativeLayout
Vikas Patidar
2

Différence entre @+id et @idest:

  • @+id est utilisé pour créer un identifiant pour une vue dans R.java fichier.
  • @id est utilisé pour référencer l'id créé pour la vue dans le fichier R.java.

Nous utilisons @+id avecandroid:id="" , mais que se passe-t-il si l'id n'est pas créé et que nous le référons avant d'être créé (référencement avant).

Dans ce cas, nous utilisons @+id pour créer id et lors de la définition de la vue, nous devons le référencer.

Veuillez vous référer au code ci-dessous:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

Dans le code ci-dessus, id pour Spinner @+id/spinner est créé dans une autre vue et lors de la définition du spinner, nous faisons référence à l'ID créé ci-dessus.

Donc, nous devons créer l'id si nous utilisons la vue avant la création de la vue.

Vente de Kunal
la source
1

Différence entre “@+id/”et“@id/” dans Android

Le premier est utilisé pour créer le IDcomposant ui particulier et l'autre est utilisé pour référencer le composant particulier

Gurpreet Singh
la source
1

Si l'élément de vue effectue la même opération, vous pouvez utiliser le @+idpour chaque entrée dans n'importe quelle mise en page car pendant la compilation de plusieurs, @+id/foole R.javafichier ne crée qu'une seule énumération. Ainsi, par exemple, si j'ai un bouton d'enregistrement sur chaque page qui effectue la même opération, j'utilise android:id="@+id/button_save"dans chaque mise en page. Le fichier R.java n'a qu'une seule entrée pour le button_save.

TheChrisONeil
la source