Kotlin合成扩展视图

时间:2017-04-23 04:56:58

标签: kotlin kotlin-android-extensions kotlin-extension

我有一些包含一些视图的布局,其中一个有ID 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
    }
}

我尝试使用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>

我的错误在哪里?

1 个答案:

答案 0 :(得分:20)

该错误试图告诉您,您只能在ActivityFragment内访问包含扩展程序的视图。这是因为找到具有给定ID的视图与您手动执行的操作完全相同,只需调用Activity.findViewById()Fragment.getView().findViewById(),然后执行类型转换为View的特定子类。我猜测您的控制器不是ActivityFragment

如果您可以以某种方式将布局的根视图传递给控制器​​,那么还有另一种使用扩展的方法。然后你可以做以下事情:

val title: TextView = rootView.title_whalemare

同样,这只是替换View.findViewById()调用和类型转换。