Android Kotling扩展,用于绑定通用视图

时间:2019-02-20 14:50:26

标签: android generics kotlin

我有一个通用的自定义视图,例如

class MyGenericCustomView<T>(context: Context, attrs: AttributeSet) : AnotherView(context, attrs) {
    ...
}

在活动/片段XML中,我有:

<package.name.MyGenericCustomView
   android:id="@+id/custom_id"
   ....
/>

如果我使用旧方法,则可以使用类似以下内容的“类型化”自定义视图:

override fun onCreate(...) {
    ...
    val myCustomView = findViewById<MyGenericCustomView<String>>(R.id.custom_id)
    ...
}

但是,如果我使用Android Kotlin扩展程序(合成的)来使用相同的ID命名对象,那么我就没有办法传递Generic类型,因此

//custom_id is of type MyGenericCustomView<*>

一种解决方案是创建一个特定的类,例如

class MySpecificCustomView(context: Context, attrs: AttributeSet) : MyGenericCustomView<String>(context, attrs) {
    ....
}

但是我不想创建这个样板类。 有什么解决方案仅使用Kotlin Extensions指定自定义类型?

谢谢

1 个答案:

答案 0 :(得分:0)

由于无法在XML中指定类型参数,并且字节代码中的类型参数也已删除,因此您可以将值强制转换为适当的通用类型MyGenericCustomView<String>

所以类似的事情应该起作用:

val myView = custom_id as MyGenericCustomView<String>

为了更好地使用您的“活动/片段”,我个人会这样使用lazy { }

class MyActivity() : Activity(…) {

    val myView by lazy { custom_id as MyGenericCustomView<String> }

    ...
}