web-dev-qa-db-fra.com

Référence non résolue pour la vue synthétique lorsque la présentation est dans le module de bibliothèque

en utilisant Kotlin 1.20.20 (pas que ça compte, les anciennes versions se comportent de la même manière)

Lorsque la mise en page se trouve dans un module de bibliothèque séparé, Android Studio n'a aucun problème à trouver et à référencer la vue.

import kotlinx.Android.synthetic.main.view_user_input.*

Mais lorsque j'essaie de compiler l'application, elle échoue avec Unresolved reference: view_user_input sur :app:compileDebugKotlin.

Tout fonctionne bien lorsque view est référencé DANS le module de bibliothèque.

Est-ce que j'ai râté quelque chose?

Ajout de la structure du projet. Tous les modules utilisent kotlin et kotlin-extensions.

build.gradle
app/
  build.gradle //main application
library-module-a/
  build.gradle //library application
library-module-b/
  build.gradle //library application

Voici un exemple d'application https://github.com/mjurkus/KotlinxTest

Numéro enregistré pour cela dans KT tracker

10
Martynas Jurkus

vous pouvez essayer de passer à 1.2.30-eap-16 et d’ajouter

androidExtensions { experimental = true }

à votre build.gradle.

1
Ivan Morgillo

J'ai aussi eu ce problème et ma solution est:

  • N'utilisez pas import kotlinx.Android.synthetic.main .... *

  • Utilisez findViewById ()

Ex: textview_id.text = "abc". Je le change en findViewById (R.id.textview_id) .text = "abc"

1
Anh Duy

Comme mentionné dans le commentaire de @cesards ci-dessus, ceci est un problème d'actualité avec les extensions Android de Kotlin. Et ce n'est pas résolu à partir d'aujourd'hui.


Bon: Utiliser des vues personnalisées

Ma suggestion principale consiste à encapsuler la vue et le comportement pertinent en tant que vue personnalisée. Au lieu de l'inclure via la balise <include>, utilisez-la directement dans votre présentation en tant que <com.example.app.YourCustomView>.

Cela fonctionnera peu importe si votre classe de vue est dans un autre module ou non.


Bad and Ugly: Id Collision Contournement

Cependant, j'ai trouvé une solution de contournement si vous voulez seulement obtenir une référence à partir de la vue incluse.

Suivez ces étapes pour utiliser les importations synthétiques de Kotlin pour les présentations incluses à partir d'autres modules:

  1. Donnez un identifiant à la vue dont vous voulez obtenir la référence dans le fichier XML inclus.
  2. Attribuez le même identifiant à la balise include du fichier XML inclus.
  3. Maintenant synthétique importer la vue (id) de la disposition en incluant (pas de la inclus)

Je ne sais pas vraiment comment et pourquoi cela fonctionne, mais c'est une manière très fragile et sale de réutiliser des mises en page.

Exemple:

Votre mise en page incluse (fragment_example.xml)

<include
    Android:id="@+id/exampleView"
    layout="@layout/example_layout" />

Votre mise en page incluse (example_layout.xml)

<merge xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <TextView
        Android:id="@+id/exampleView"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

</merge>

Votre classe de fragments (ExampleFragment.kt)

import kotlinx.Android.synthetic.main.fragment_example.exampleView

// Do not import the exampleView through example_layout.exampleView

class ExampleFragment : Fragment() {
    // Do something with imported exampleView
}
0
SafaOrhan