web-dev-qa-db-fra.com

Android Studio 3.1.3 - Référence non résolue: R - Kotlin

Je suis nouveau sur kotlin, j'ai converti du code à partir de Java mais il semble qu'il y ait un problème, le R dans findViewById (R.id.my_id) est mis en surbrillance en rouge et affiche le message suivant: "Référence non résolue: R" .. Je cherchais une solution mais il me semble que je ne l'ai pas trouvée. Alors, que dois-je faire? Voici une capture d'écran:

 enter image description here

15
Tamim Production

Le problème peut être causé par de nombreux facteurs, 

  • comme mentionné par martomstom dans cette réponse le problème est parfois causé par la version com.Android.tools.build:gradle; le remplacer par une version plus stable résoudrait le problème: par exemple: com.Android.tools.build:gradle:3.4.0-alpha02 avec com.Android.tools.build:gradle:3.2.1 
  • De plus, le fait d'avoir des bibliothèques du même groupe, mais avec des versions différentes, peut être à l'origine du problème, voire davantage d'erreurs d'exécution.

  • Cela peut également se produire en raison d'une incompatibilité de ressources et de code. Le fait de inclure cette ligne d'importation dans votre activité peut également résoudre le problème: import com.package.name.R

  • Cela peut parfois arriver à cause de l'IDE, des performances ou de la mémoire .. Nettoyer le projet de temps en temps peut vous faire gagner du temps. Sous Android Studio, cela ressemblerait à ceci: Build -> Clean Project / Rebuild Project- Nettoyage IDE cash contribue également aux performances et à la mémoire. Sous Android Studio, il ressemblerait à ceci: File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
  • J'ai remarqué que ce problème m'arrivait la plupart du temps lors de l'importation de nouvelles ressources. L'utilisation de caractères interdits dans leurs noms déclencherait l'erreur, telle que . , , - , UpperCase or special Letters
  • Et à titre de suggestion, si vous utilisez Kotlin, je vous recommande vivement d'utiliser des extensions Kotlin dans votre activité, telles que: import kotlinx.Android.synthetic.main.activity_page.* ou si vous utilisez une vue personnalisée: kotlinx.Android.synthetic.main.view_layout.view.*après cela Dans la méthode onCreat () d’une activité, il vous suffit d’appeler l’identifiant, par exemple: my_edit_text_ID.text = "Kotlin Dbest!", ou à partir d’une vue personnalisée: mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

MODIFIER :

  • J'ai été confronté à ce problème depuis un moment et le problème était que la bibliothèque '' R '' avait été importée de 2 sources différentes: 

    com.Android.R

    com.example.package.R

    Vous devez uniquement importer la bibliothèque '' R '' avec le nom de votre package d'application, Dans ce cas, com.example.package.R Parfois, la bibliothèque n'est pas importée du tout. Pour l'importer, cliquez sur la référence Non résolue R et appuyez sur Alt + Enter 

12
Tamim Production

J'ai utilisé com.Android.tools.build:gradle:3.3.0-alpha13 et le même problème. Passer à la version stable 3.2.1 a résolu ce problème pour moi.

22
martomstom

C'est donc une erreur trompeuse. 

Je vais expliquer la vue de 30 000 pieds de ce qui se passe. Ce n'est pas un ordre EXACT ou un flux EXACT, c'est juste assez proche;) donc si vous en savez plus que je fais de l'ordre exact et que je tiens à faire des corrections avec des liens, n'hésitez pas, je ne vous arrêterai pas :).

Le processus

Le fichier R est un code généré. 

Il y a un ordre à la génération.

Gradle va faire sa magie, tirer ses dépendances et lancer c'est arbre d'avertissement et d'erreur en premier, 

puis Android convertit tous les Kotlin en Java dans les coulisses. Yup c'est à droite, notre bien-aimé Kotlin doit encore être Java pour compiler pour notre machine virtuelle ART bien-aimée. 

Ensuite, il exécute les adaptateurs que vous avez créés pour JVM Statics et quelques autres tâches . Ensuite, il compile d'abord tous les fichiers de liaison de données XML pour créer le fichier fichiers de liaison de données générés. 

Si tout réussit, il passe au traitement des actifs et à Ressources. Ce qui crée des pointeurs ou des identifiants pour chaque ressource pour laquelle vous référence dans le code. Ensuite, il va parcourir et commencer à compiler le fichier code et processus d'emballage après cela.

C'est un processus assez simple, mais c'est là que réside le problème.

L'erreur trompeuse

Si une étape échoue avant la fin de la génération R, le R n'est pas généré. Parfois, une simple reconstruction suffit, parfois un simple Fichier-> Invalider le cache et le redémarrage suffisent. Cependant, le plus souvent, vous avez un problème de code dans votre répertoire, votre fichier xml, votre liaison de données ou vos adaptateurs qui empêche le compilateur d’atteindre même le stade de la génération R.

Donc, la prochaine question est  

"Eh bien, comment pouvons-nous résoudre le problème si les erreurs ne valent rien ou Inexistantes".

Commençons par les nombreuses façons dont ces erreurs se présentent. 

  • Classe de liaison de données en double trouvée
  • xml Binding Error à la ligne #
  • Impossible de trouver la signature correspondante de bind: customAdapterMethod
  • Impossible de trouver le fichier R du projet correct, affiche uniquement les options d'importation pour les sous-modules ou les fichiers R d'espace de nom incorrects.
  • Impossible de trouver DataBindingUtility ou DataBinding pour une activité/un fragment
  • Et de nombreuses autres façons aussi, trop nombreuses pour toutes les énumérer

Ensuite, parlons des candidats potentiels à l'origine du problème. Comme il y en a tellement beaucoup lol.

  • Problèmes de synchronisation avec Gradle 
  • Problèmes de cache (Fichier-> Restart and Invalidate Cache)
  • éléments xml avec un espace de noms incorrect
  • Éléments XML avec des ID ou des ID de référence incorrects (par exemple, vous dites aligner à droite d'un élément situé plus bas dans le document xml, puis l'élément frère qui essaie de le référencer)
  • problèmes de liaison de données XML faisant référence à un espace de noms ou à un membre inexistant ou mal typé
  • problèmes de liaison de données XML dans les zones non remplies automatiquement, tels que les attributs personnalisés utilisant des adaptateurs, car ceux-ci sont plus difficiles à détecter. c'est-à-dire bind: myCustomMethod = @ "myObject.mistypedProperty ()"
  • Adaptateurs statiques JVM avec problèmes ou signatures dupliquées
  • Caractère en double ou incorrect dans le fichier Strings ou Dimens ou dans tout autre fichier xml
  • Variable privée marquée pour @Binding sans propriétés pour y accéder
  • Variable membre marquée pour @Binding qui correspond à une méthode de classe parent provoquant des duplications se traduisant par des erreurs presque impossibles
  • Non concordance de types tels que l'utilisation d'un adaptateur prenant (Int) mais que vous transmettez (Int?) Via la liaison de données et que celle-ci n'est pas reconnue par JVM Statics avant la compilation
  • Vous avez sélectionné IMPORT dans un popup pour importer le fichier R d'un sous-module à la place du fichier d'application.
  • Avoir des membres pouvant être liés dans une classe enfant ou parent, mais ne pas donner d'espace de nom complet à la classe dans l'utilisation XML de la classe parent ou enfant. Comme le compilateur de liaison de données n'est pas assez intelligent pour réaliser la variable fournie pour la classe Foo est également la classe de base parentFoo, vous devez donc la qualifier d'Android: text = "@ ((com.path.parentFoo) foo) .parentMethod"
  • Avoir un nom de méthode dans une classe, qui correspond à une "propriété générée à partir de la variable membre @Binding" c'est-à-dire firstName en tant que variable, mais ayant ensuite une méthode appelée getFirstName dans une classe parent ou enfant, car vous correspondez maintenant à un nom de méthode qui se générer automatiquement, provoquant ainsi des erreurs de classe de duplication dataBindingUtility.
  • Il y a plus de causes, mais cela devrait vous donner une série de lieux à regarder, mais la liste peut s'allonger encore et encore.

Malheureusement, cela se produit souvent dans les technologies de pointe Edge où les outils d'interface utilisateur ne sont pas encore à la hauteur des outils basés sur les terminaux. Donc, je vous suggère de courir à partir de la racine du projet dans un terminal avec

bash gradlew assembleRelease --debug

Quand cela échoue, et ce sera le cas. Commencez à faire défiler les journaux jusqu'à ce que vous trouviez le rouge où vous voyez ce qui échoue réellement et empêche la prochaine étape de se produire.

Cela vous sera particulièrement utile lorsque vous commencerez à traiter les liaisons de données. POINTE: .

Lorsque vous commencez à traiter les liaisons de données, assurez-vous de les compiler et de les exécuter souvent, car le but est de les reconnaître immédiatement avant de créer d’autres fichiers, afin de vous assurer que vous n’avez pas interrompu la génération et rendu votre vie BEAUCOUP plus facile de connaître le code que vous venez d’ajouter. avant d'aller trop loin.

Temps à compiler et à exécuter pour confirmer aucun problème avant de passer. 

.

  • Si vous ajoutez des variables à votre XML à utiliser
  • Si vous vous liez aux propriétés de votre modèle dans 1 fichier
  • Si vous ajoutez une liaison à un JVMStatic
  • Si vous ajoutez des membres ou des propriétés pouvant être liés à un modèle
  • Si vous refactorisez le déplacement de variables ou propriétés de membres observables dans des enfants ou des classes de base
  • Tout autre élément lié au xml ou à la liaison pouvant affecter le code généré.
  • Comme je l’ai mentionné ci-dessus, la raison est d’éviter d’obtenir autant de modifications, que le fait de trouver une erreur générique vague et horrible liée au code de liaison de données généré devient un cauchemar. Je suis sûr que les outils vont s’améliorer, mais pour le moment, rendez-vous service, compilez-le et exécutez-le souvent lorsque vous modifiez des éléments liés à la liaison de données.

Code heureux.

Happy Coding

5
Sam

Utilisez les commandes de gradation.
Dans Android Studio, dans le menu de droite:
Gradle -> :app -> Tasks -> build -> clean.
Après cela, Gradle -> :app -> Tasks -> build -> build

5
Fireworks

J'ai eu le même problème et j'ai essayé de ne pas rétrograder de la version 3.3 à la version 3.2.1. Au lieu de cela, j'ai mis à jour Android Studio vers la version 3.3, ce qui me convenait bien ;-)

2
HasBert

Cela a fonctionné pour moi. La quantité de travail dépend de la taille de votre projet. J'ai démarré un nouveau projet, créé les modules requis (XML, Kotlin, couleurs, chaînes de caractères, etc.), puis copié le code dans les modules du nouveau projet à partir des modules de l'ancien projet. La copie XML économise beaucoup de temps par rapport à la recréation de l'interface utilisateur. Globalement, cela prend un peu de temps, mais j’ai passé beaucoup plus de temps à corriger l’erreur de référence non résolue sans cette erreur.

0
Earl Whitney

ESSAYE ÇA

Accédez au fichier content_main.xml et vous devez modifier le

Android:id="@+id/??????"> ligne de code correspondant à l'identifiant que vous avez attribué à votre fichier.

Remplacez le point d'interrogation ?????? par le nom d'identifiant de fichier associé (si vous ne connaissez pas l'identifiant, accédez à l'onglet Conception en bas et cliquez sur l'actif associé.

Sur le côté droit sous les attributs, vous pouvez trouver l'ID que vous lui avez donné . S'il est vide, vous pouvez le nommer à nouveau et Android Studio écrira le code.

Puis redémarrez Android Studio. J'espère que cela aidera. Bonne codage.

0
PRANAY REDDY

J'ai eu le même problème avec la référence R aussi ... .. Enfin, Android Studio 3.3 a été publié et en utilisant 'com.Android.tools.build:gradle:3.3.0', le problème a été corrigé!

0
Josue

Je crois que je suis tombé sur la vraie réponse (bien que par accident).

En outre, mon fichier KT ayant échoué à l’opération dans l’opération, ainsi que dans d’autres classes en Java. Ce que j'ai remarqué, c'est qu'il y avait une différence de casse entre les noms de fichiers. Une fois que j'ai corrigé les instructions d'importation pour correspondre à la casse du paquet (aka, dossier), les erreurs résolues.

0
Ken