我有一个通用的自定义视图,例如
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指定自定义类型?
谢谢
答案 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> }
...
}