2016-03-29 6 views
3

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

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

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

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

+0

Есть ли [Kotterknife] (https://github.com/JakeWharton/kotterknife) вариант? – AndroidEx

+0

был до того, как я начал использовать Android Extensions: p Я просто просто пропустил KotterKnife, потому что у него нет никакого способа повторного привязки просмотров –

ответ

2

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

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

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

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

Смежные вопросы