gpt4 book ai didi

用于绑定(bind)通用 View 的 Android Kotlin 扩展

转载 作者:行者123 更新时间:2023-11-30 05:04:30 25 4
gpt4 key购买 nike

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

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

在我的 Activity/fragment XML 中:

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

如果我使用旧方法,我可以使用类似以下内容的方式获取我的“类型化”自定义 View :

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

但是如果我使用 Android Kotlin 扩展(合成的)来拥有一个以相同 ID 命名的对象,我就没有办法传递通用类型,所以

//custom_id is of type MyGenericCustomView<*>

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

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

但我不想创建这个样板类。是否有仅使用 Kotlin 扩展来指定自定义类型的解决方案?

谢谢

最佳答案

由于您不能在 XML 中指定类型参数并且类型参数也在字节码中被删除,您可以简单地将值转换为适当的泛型类型 MyGenericCustomView<String> .

所以类似的东西应该可以工作:

val myView = custom_id as MyGenericCustomView<String>

为了在您的 Activity/Fragment 中更好地使用,我个人会使用 lazy { }像这样:

class MyActivity() : Activity(…) {

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

...
}

关于用于绑定(bind)通用 View 的 Android Kotlin 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54789070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com