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
vous pouvez essayer de passer à 1.2.30-eap-16
et d’ajouter
androidExtensions {
experimental = true
}
à votre build.gradle
.
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"
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.
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.
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:
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.
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
}