web-dev-qa-db-ja.com

ビュー用のKotlin合成拡張機能

私はいくつかのビューのあるレイアウトを持っています。そのうちの1つはtitle_whalemareというIDを持っています

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
    }
}

kotlin extensionsで見つけようとしましたが、次のエラーが表示されて見つからない

レシーバータイプが一致しないため、次の候補は該当しません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>

私の間違いはどこですか?

16
whalemare

エラーが伝えようとしているのは、ActivityまたはFragment内からのみ拡張機能付きのビューにアクセスできることです。これは、指定されたIDを持つビューを手動で実行するのとまったく同じように検索し、Activity.findViewById()およびFragment.getView().findViewById()を呼び出してから、型を実行するためです。 Viewの特定のサブクラスにキャストします。あなたのコントローラーがActivityでもFragmentでもないと思います。

何らかの方法でレイアウトのルートビューをコントローラーに渡すことができる場合、拡張機能を使用する別の方法があります。次に、以下を実行できます。

_val title: TextView = rootView.title_whalemare
_

繰り返しますが、これはView.findViewById()呼び出しと型キャストを置き換えるだけです。

25
zsmb13