Kotlin с Android: базовые классы и расширения для Android Kotlin

Поэтому я использовал Kotlin Android Extensions и я считаю, что он очень прост в использовании и стоит того. Больше нет findViewById или Butterknife.Bind(...) . Я не обнаружил никаких проблем с этим, кроме одной ситуации.

В базовом классе, например BaseActivity , обычно есть куча представлений, которые будут присутствовать во всех макетах, например, на панели инструментов. И такие общие операции, как changeToolbarColor() или setToolbarTitle() .

В этих простых случаях я не могу использовать Kotlin Android Extensions потому что, поскольку это базовый класс, само представление будет присутствовать на нескольких макетах и ​​не может быть импортировано свойство. В этом случае я просто использую by lazy {find<>(...) .

Можно ли это сделать с помощью встроенного плагина расширения Android?

    Kotlin Android Extensions генерирует функцию расширения для каждого элемента в заданном макете. Поскольку методы расширения существуют за пределами модели наследования, нет способа определить общий протокол, такой как abstract val toolbar:Toolbar для родителя.

    Однако под капотом методы расширения выполняют только findById , если данный идентификатор существует на макете, он будет извлекать элемент. Это означает, что если вы поддерживаете те же идентификаторы для своих общих элементов внутри своих макетов (т. Е. Все панели инструментов с помощью @id/toolbar ), вы можете создать фиктивный макет с вашими общими элементами и их соответствующими идентификаторами. Этот макет будет работать как своего рода интерфейс, позволяя вам import kotlinx.android.synthetic.main.base_activity_dummy.* И тем самым генерировать import kotlinx.android.synthetic.main.base_activity_dummy.* вам методы расширения.

    Выполняя описанное выше, this.toolbar на вашем BaseActivity будет извлекать фактический элемент вашей конкретной деятельности вместо элемента на макетном макете.

    Конечно, эта техника, хотя и удобна, подвержена ошибкам и может сделать вашу программу очень запутанной для постороннего. Но опять же, это не будет больше подверженности ошибкам, чем вызов findById во findById мире.

    Intereting Posts
    Kotlin .let {} null безопасность предположительно ложная ошибка Ошибка компиляции Kotlin при использовании Parcelable arrayListOf и hashMapOf: неразрешенная ссылка Кнопка Kotlin setOnclickListener не работает Функция доступа перед вызовом конструктора суперкласса в классе данных Kotlin Доступ к свойствам задачи в градле Котлин Список несоответствий типа Kotlin <Any> и List <Comparable <{com.cognitect.transit.Symbol & com.cognitect.transit.Keyword}>?> Есть ли способ остановить сбой в пустое десятичное значение в EditText в kotlin? Попробуйте монаду для kotlin Kotlin: Интерфейс … не имеет конструкторов Как использовать библиотеку многократного использования в kotlin, с андроидом и javascript? Хорошо ли использовать функцию запуска вместо возврата в Котлин? Мой проект Kotlin Не удается разрешить зависимости от Travis-CI Царство, возвращающее устаревшие данные Kotlin – единственный экземпляр класса, не являющегося одиночным?