web-dev-qa-db-fra.com

Configuration gonflée par programme avec les extensions Kotlin Android

J'ai une mise en page suivante:

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
    Android:orientation="vertical"
    Android:background="@Android:color/white"
    Android:paddingLeft="20dp"
    Android:paddingRight="20dp">

    <TextView
        Android:id="@+id/tvErrorTitle"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp"
        Android:textColor="@Android:color/background_dark"
        Android:textSize="18sp"
        />
    <TextView
        Android:id="@+id/tvErrorDesc"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="30dp"
        Android:textColor="@Android:color/darker_gray"
        Android:textSize="16sp"
        />
    <TextView
        Android:id="@+id/tvAction"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="30dp"
        Android:layout_marginBottom="10dp"
        Android:layout_gravity="end"
        Android:padding="5dp"
        Android:textSize="15sp"
        Android:textStyle="bold"
        Android:textAllCaps="true"
        Android:textColor="@Android:color/holo_purple"
        />
</LinearLayout>

Lorsque je veux utiliser extensions kotlin Android en dehors des activités décrites ci-dessous, cela ne fonctionne pas. J'ai fini par faire findViewById.

...
...
import kotlinx.Android.synthetic.main.dialog_error.*
...
...
 val view = LayoutInflater.from(context).inflate(R.layout.dialog_error, null, false)
    val tvErrorTitle = view.findViewById(R.id.tvErrorTitle) as TextView
    val tvErrorDesc = view.findViewById(R.id.tvErrorDesc) as TextView
    val tvErrorAction = view.findViewById(R.id.tvAction) as TextView

Il ne tire pas les vues directement à partir de XML. Comment l'utiliser dans une mise en page programmée et éviter findViewById?

Note: Cette question appartient strictement à Kotlin Android Extensions , pas au langage lui-même.

Edit J'ai importé les deux: 

import kotlinx.Android.synthetic.main.dialog_error.view.*
import kotlinx.Android.synthetic.main.dialog_error.*

Mais Android Studio tente toujours d'importer à partir de R.id et ne reconnaît pas ces deux importations. Est-ce qu'il manque quelque chose?

8
Krupal Shah

Depuis le docs que vous avez lié :

Si nous voulons appeler les propriétés synthétiques sur View (utile dans les classes d’adaptateur), nous devons également importer 

kotlinx.Android.synthetic.main.activity_main.view.*.

Autrement dit, importez kotlinx.Android.synthetic.main.layout.view.* également pour charger les propriétés de l’extension View

Ensuite:

val view = LayoutInflater.from(context).inflate(...)
view.tvErrorTitle.text = "test"
24
nhaarman