Comment accéder à la vue en utilisant l’extension synthétique Kotlin si j’ai une disposition comme celle-ci:
fichier: two_days_view.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<include
Android:id="@+id/day1"
layout="@layout/day_row"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
<include
Android:id="@+id/day2"
layout="@layout/day_row"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
fichier: day_row.xml
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
<TextView
Android:id="@+id/dayName"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</LinearLayout>
Comment accéder à dayName? J'ai cherché certains comme ceci:
day1.dayName.text = "xxx"
day2.dayName.text = "sss"
Je vois dans Studio que j’ai accès à dayName
mais à quel nom de dayName TextView fait référence?
Normal si je n'ai qu'une seule disposition incluse, cela fonctionne bien. Mais maintenant, j'ai plusieurs fois inclus la même mise en page.
bien sûr je peux toujours faire:
day1.findViewById(R.id.dayName).text = "xxx"
mais je cherche une belle solution. :)
En règle générale, vous ne devez pas construire de présentations qui ont plusieurs vues avec le même identifiant - pour cette raison même.
Mais, pour résoudre votre problème: Au lieu d’importer
kotlinx.Android.synthetic.main.layout.day_row.*
vous pouvez importer
kotlinx.Android.synthetic.main.layout.day_row.view.*
(Notez le .view
supplémentaire à la fin).
Cela importera les vues non pas en tant que propriétés au niveau de l'activité/du fragment, mais en tant que propriétés d'extension pour View
. De cette façon, vous pouvez le faire comme vous le souhaitez, en supposant que day1
et day2
contiennent les vues souhaitées:
day1.dayName.text = "xxx"
day2.dayName.text = "sss"
“Le danger de l’utilisation de kotlin.syntetic pour le bloc dans la présentation” https://link.medium.com/rMwau5VAZT
J'ai eu le même cas. Voici comment je l'ai fait fonctionner:
Mise en page dans mon activité/fragment:
<include
Android:id="@+id/field1"
layout="@layout/merge_field"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<include
Android:id="@+id/field2"
layout="@layout/merge_field"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
Mise en page: merge_field.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/mergeContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/tv_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</FrameLayout>
Code Kotlin:
val tv_title = field1?.findViewById(R.id.tv_title)
tv_title.text = "This way it works"
Notez la vue racine <FrameLayout>
. Il seulement a travaillé pour moi de cette façon.
Utilisation d'une balise <merge>
cela n'a pas fonctionné