Расширение Android Kotling для связывания общего вида - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть общее настраиваемое представление, например

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 (синтетическое), чтобы получить объект с таким же идентификатором, у меня не будет способа передать тип Generic, поэтому

//custom_id is of type MyGenericCustomView<*>

Одним из решений является создание определенного класса, например

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

Но я не хочу создавать этот шаблонный класс.Есть ли какое-либо решение для указания пользовательского типа только с использованием расширений Kotlin?

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Поскольку вы не можете указать параметр типа в XML, а параметры типа также стерты в байтовом коде, вы можете просто привести значение к соответствующему универсальному типу MyGenericCustomView<String>.

Так что-то подобное должноработа:

val myView = custom_id as MyGenericCustomView<String>

Для лучшего использования в вашей Деятельности / Фрагменте я бы лично использовал lazy { }, например:

class MyActivity() : Activity(…) {

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

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...