Je suis nouveau à kotlin, j’ai converti un peu de code de java, mais il semble qu’il ya quelque chose de mal, Le R dans findViewById(R.id.my_id) est mis en évidence en rouge et il montre ce message: "Référence non résolue: R". J’ai été à la recherche d’une solution, mais je ne semble pas le comprendre, Alors que dois-je faire? Voici une capture d’écran :
Réponses
Trop de publicités?Le problème peut être causé par de nombreux facteurs,
- comme mentionné par martomstom dans cette Réponse, le problème est parfois causée par
com.android.tools.build:gradle
version, en changeant de version plus stable permettrait de résoudre le problème: par exemple:com.android.tools.build:gradle:3.4.0-alpha02
aveccom.android.tools.build:gradle:3.2.1
Aussi, pour avoir des bibliothèques dans le même groupe, mais avec les différentes versions qui peut provoquer le problème ou même plus d'erreurs à l'exécution. l'utilisation de l'exclure du groupe de la méthode comme suit :
implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.android.support') }
dans ce cas, picasso bibliothèque utilise android.les éléments de soutien, le android version de bibliothèque utilisée dans picasso est différent de celui que vous utilisez actuellement dans votre application, afin de résoudre ce problème, nous devons exclure complètement de son sous de la bibliothèque et des groupes de classe.Il peut aussi arriver par l'inadéquation des ressources et du code, y compris l'importation dans votre activité est susceptible de résoudre le problème de trop :
import com.package.name.R
- Parfois, il peut se produire en raison de l'IDE, des performances ou de la mémoire.. Nettoyage du projet de temps en temps peut vous faire économiser du temps, sur Android Studio, il serait quelque chose comme ceci :
Build -> Clean Project / Rebuild Project
- Nettoyage IDE de trésorerie contribue également à la performance et de la mémoire, sur Android Studio, il ressemblerait à ceci :File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
- J'ai remarqué que ce problème m'arrive la plupart du temps lors de l'importation de nouvelles ressources, en Utilisant les caractères interdits dans leur nom le feu de l'erreur, comme
. , , - , UpperCase or special Letters
- Et comme une suggestion , si vous êtes à l'aide de Kotlin, je recommande vraiment à l'aide de Kotlin extensions dans votre activité, tels que : importer
kotlinx.android.synthetic.main.activity_page.*
ou si vous utilisez un affichage personnalisé :kotlinx.android.synthetic.main.view_layout.view.*
après que, dans onCreat() la méthode d'une activité , vous n'aurez qu'à appeler l'identifiant, par exemple :my_edit_text_ID.text = "Kotlin Dbest!"
, ou à partir d'un affichage personnalisé :mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"
EDIT :
-
J'ai été confronté à ce problème againe et le problème était le " R " de la bibliothèque a été importé à partir de 2 sources différentes :
com.android.R
com.exemple.package.R
Vous devez importer uniquement le " R " de la bibliothèque avec votre package d'application nom, dans ce cas -
com.example.package.R
Parfois, la bibliothèque n'est pas importé à tous, pour l'importer, cliquez sur le référence non résolueR
et appuyez surAlt + Enter
EDIT:
Comme tobltobs mentionné dans la section des commentaires: "la Plupart du temps le problème est causé par une autre erreur qui empêche le système de construction à partir de la création généré sources. Pour trouver la cause racine de regarder la gradle journal (le "toggle view" icône ci-dessous, du marteau, de couleur verte à la sortie de la construction) et recherchez les erreurs non liées à la R ou BuildConfig (également généré). Si il n'y a pas d'autre erreur de gauche et le problème avec R persiste alors peut-être quelque chose de cette liste peut vous aider. "
C'est donc une erreur trompeur.
Je vais vous expliquer la 30,000 pieds de vue de ce qui se passe. Ce n'est pas l'ordre EXACT ou le débit EXACT, c'est juste sacrément proche ;) donc si vous en savez plus, puis-je faire de l'ordre exact et les soins à apporter des corrections avec des liens, n'hésitez pas je ne vais pas l'en empêcher :).
Le Processus
Le R de fichier est le code généré.
Il y a un ordre de la génération.
Gradle va faire, c'est de la magie, tirez sur les dépendances et le coup d'envoi c'est d'avertissement et d'erreur de l'arbre de la première,
puis Android convertit tous les Kotlin à Java en coulisses. Yup c'est droit, notre bien-aimé Kotlin a encore à Java compiler pour notre bien-aimé de l'ART de la machine virtuelle.
Puis il traverse et ne les cartes que vous avez créées pour La JVM de la Statique et de quelques autres tâches. Ensuite, il compile tous les xml de la liaison de données de fichiers à créer la généré liaison de données des fichiers.
Si tout réussit, elle se déplace sur le traitement des actifs et des les ressources. Ce qui crée des pointeurs ou des Identifiants pour chaque ressource que vous de référence dans le code. Ensuite, il va courir à travers et de commencer la compilation de l' code et processus d'emballage après.
Jolie processus simple, mais ici se trouve le problème.
L'Erreur trompeur
Si échec d'une étape avant le R de la génération est terminée, puis la R n'est pas générée. Parfois, une simple reconstruction est tout ce que vous devez faire, parfois, un simple Fichier->Invalider le Cache et Redémarrage est tout ce dont vous avez besoin. Cependant, plus souvent qu'autrement, vous disposez d'un code de problème dans votre gradle, xml, votre liaison de données ou de vos cartes empêcher le compilateur de même d'atteindre la R du stade de génération.
Donc, la prochaine question est
"Bien tirer, comment pouvons-nous résoudre si les erreurs sont sans valeur ou inexistante".
Eh bien d'abord, nous allons parler sur les nombreuses façons dont ces erreurs se présenter.
- Double liaison de données de la classe trouvée
- Liaison xml Erreur à la ligne #
- Ne pouvais pas trouver la correspondance signature de bind:customAdapterMethod
- Ne pouvez pas trouver la R de fichier du projet correct, ne montre que des options d'importation pour les sous-modules ou incorrecte de l'espace de noms R fichiers.
- Ne pouvais pas trouver DataBindingUtility ou de la liaison de données pour l'activité/fragment
- Et beaucoup de diverses autres façons, trop nombreux pour les énumérer tous
Ensuite, nous allons parler sur les candidats potentiels à l'origine du problème. Comme il ya tellement de nombreux lol.
- Gradle la Synchronisation des questions
- Problèmes de mise en cache (Fichier->Redémarrer et Invalider le Cache)
- les éléments xml avec un espace de noms
- les éléments xml avec de mauvais Identifiants ou des références Id de commande (c'est à dire vous dire aligner à droite d'un élément qui est plus bas dans le document xml, puis l'élément frère qui essaie de référence)
- la liaison de données xml questions de référencement de noms ou d'un membre qui n'existe pas ou n'est pas correcte
- la liaison de données xml questions de non-auto-rempli de taches comme des attributs personnalisés à l'aide de cartes comme celles qui sont plus difficiles à repérer. c'est à dire lier:myCustomMethod=@"myObject.mistypedProperty()"
- JVM Statique cartes avec des questions ou dupliqué signatures
- En double ou en mauvais caractère dans les Cordes ou Dimens fichier, ou tout autre fichier xml pour que la matière
- Variable privée marqué pour @Liaison sans propriétés pour y accéder
- Membre de la variable marqué pour @Liaison qui correspond à un parent de la classe de la méthode de causer des duplications qui se manifeste dans presque impossible erreurs
- Incompatibilité de types comme à l'aide d'un adaptateur qui prend (Int), mais vous êtes de passage (Int?) via la liaison de données et il n'est pas reconnu avec la JVM de la Statique jusqu'à ce moment de la compilation
- Vous avez sélectionné à l'IMPORTATION sur une fenêtre importer R fichier d'un sous-module à la place du dossier de candidature
- Ayant bindable membres chez un enfant ou un parent de la classe, mais ne donnant pas pleinement qualifié de l'espace de noms de la classe moulé dans le XML de l'utilisation d'un parent ou d'un enfant de la classe. Comme le databinding compilateur n'est pas assez intelligent pour réaliser la variable fourni pour la classe Foo est également parentFoo baseclass, vous avez donc la qualifier de android:text="@((com.chemin d'accès.parentFoo)foo).parentMethod"
- Avoir un nom de méthode dans une classe, qui correspond à une "propriété générée à partir de @Liaison variable membre" c'est à dire prenom comme une variable, mais de disposer d'une méthode appelée getFirstName, un parent ou d'un enfant de la classe, parce que vous êtes maintenant correspondant à un nom de la méthode qui sera généré automatiquement, provoquant ainsi le dataBindingUtility le dédoublement de la classe des erreurs.
- Il y a plus de causes, mais ce devrait vous donner une série de lieux à regarder, mais la liste peut continuer encore et encore au sérieux.
Malheureusement, cela se passe beaucoup de choses dans le saignement des technologies de pointe, où l'INTERFACE outils ne sont pas à la vitesse avec le terminal outils encore. Donc, je vous suggère de courir à partir de la racine du projet dans un terminal
bash gradlew assembleRelease --debug
Lorsqu'il échoue, et il le fera. Commencer à défiler à travers les journaux jusqu'à ce que vous trouver la rouge où vous pouvez voir ce qui est réellement défaut et la prévention de la prochaine étape de se produire.
Vous trouverez cela est particulièrement utile lorsque vous commencez à traiter avec la liaison de données.
ASTUCE:
Lorsque vous commencez à traiter avec la liaison de données, assurez-vous que vous compilez et exécutez souvent parce que le but est de reconnaître immédiatement avant de faire d'autres fichiers assurez-vous de ne pas briser la génération et de rendre votre vie BEAUCOUP plus facile de connaître le code que vous venez d'ajouter à l'origine du problème avant de monter trop loin.
Temps pour compiler et exécuter pour confirmer l'absence de questions avant de passer.
- Si vous ajoutez un peu de JVM de la statique, de compiler et d'exécuter
- Si vous ajouter des variables à votre XML à utiliser
- Si vous liez les propriétés de votre modèle dans 1 fichier
- Si vous ajoutez une liaison à une JVMStatic
- Si vous ajoutez bindable membres ou des propriétés d'un modèle
- Si vous refactoriser mouvement observable membre variables ou propriétés dans les enfants ou les classes de base
- Toute autre xml ou de lier des éléments connexes qui peuvent effet, le code généré.
Comme je l'ai mentionné ci-dessus, la raison est d'éviter de faire beaucoup de changements, qu'il devient un dépannage cauchemar pour trouver un générique vague, horrible erreur liées à a généré de la liaison de données de code. Je suis sûr que les outils va s'améliorer, mais pour l'instant, ne vous une faveur et de les compiler et exécuter souvent lors de la modification de la liaison de données d'articles connexes.
Bon Codage