web-dev-qa-db-fra.com

Extension synthétique Kotlin et plusieurs incluent la même disposition

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. :)

8
LunaVulpo

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"
25
Robin

“Le danger de l’utilisation de kotlin.syntetic pour le bloc dans la présentation” https://link.medium.com/rMwau5VAZT

0
Werder

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é

0
voghDev