web-dev-qa-db-fra.com

Extension synthétique Kotlin pour la vue

J'ai une mise en page avec quelques vues, l'une d'elles a l'identifiant title_whalemare

import kotlinx.Android.synthetic.main.controller_settings.*
import kotlinx.Android.synthetic.main.view_double_text.*

class MainSettingsController : BaseMvpController<MvpView, MvpPresenter>() {

    val title: TextView = title_whalemare

    override fun getLayout(): Int {
        return R.layout.controller_settings
    }
}

J'essaye de le trouver avec kotlin extensions, mais je ne peux pas car j'obtiens l'erreur suivante

Aucun des candidats suivants n'est applicable en raison de l'inadéquation du type de récepteur None of the following candidates is applicable because of receiver type mismatch

controller_settings.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="match_parent"
              Android:orientation="vertical">

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

</LinearLayout>

Où est mon erreur?

16
whalemare

Ce que l'erreur essaie de vous dire, c'est que vous ne pouvez accéder aux vues avec extensions qu'à partir d'un Activity ou d'un Fragment. C'est parce qu'il fait exactement la même chose pour trouver les vues avec les ID donnés que ce que vous feriez manuellement, il appelle simplement Activity.findViewById() et Fragment.getView().findViewById(), puis fait le type cast dans la sous-classe spécifique de View. Je suppose que votre contrôleur n'est pas un Activity ou Fragment.

Il existe une autre façon d'utiliser les extensions, si vous pouvez en quelque sorte transmettre la vue racine de votre disposition à votre contrôleur. Ensuite, vous pouvez effectuer les opérations suivantes:

val title: TextView = rootView.title_whalemare

Encore une fois, cela remplace simplement l'appel View.findViewById() et le type cast.

25
zsmb13