Инструкция для Android

Конфигурация библиотеки и отрисовка первой DivView

Настройка зависимостей

Добавьте в проект зависимость от DivKit:

    implementation 'com.yandex.div:div:$version'
    implementation 'com.yandex.div:div-core:$version'
    implementation 'com.yandex.div:div-json:$version'

Последнюю версию библиотеки можно узнать на странице релизов.

Создание DivConfiguration

Создайте и настройте в коде конфигурацию DivConfiguration:

    val imageLoader = PicassoImageLoader(..)
    val configuration = DivConfiguration.Builder(imageLoader).build()

DivConfiguration имеет только один обязательный параметр — imageLoader: DivImageLoader. Вы можете реализовать свой загрузчик, либо использовать одну из наших иплементаций:

  • PicassoImageLoader
  • GlideImageLoader

Зависимости для их использования нужно добавить отдельно:

    implementation 'com.yandex.div:picasso:$version' 
    implementation 'com.yandex.div:glide:$version'

Создание DivData

Верстка в DivKit состоит из двух основных блоков — шаблоны и сама карточка. Они могут приходить как отдельно друг от друга, так и быть в одном JSON файле. Рассмотрим пример, когда пришедшая верстка имеет такую структуру:

{
    "templates": { ... шаблоны ... },
    "card": { ... карточка ...}
}

Тогда метод для обработки DivData будет выглядеть так:

fun JSONObject.asDiv2DataWithTemplates(): DivData {
    val templates = getJSONObject("templates")
    val card = getJSONObject("card")
    val environment = DivParsingEnvironment(ParsingErrorLogger.LOG)
    environment.parseTemplates(templates)
    return DivData(environment, card)
}

Обработка карточки и вывод на экран

Выведем на экран небольшой текст:

val card = """
{
    "card": {
        "log_id": "text",
        "states": [
            {
                "state_id": 0,
                "div": {
                    "type": "text",
                    "text": "Hello, DivKit!"
                }
            }
        ]
    }
}
""".trimIndent()

Теперь соберем все описанное выше воедино и добавим View в иерархию:

    val divData = JSONObject(card).asDiv2DataWithTemplates()
    val div2View = Div2View(Div2Context(context, configuration, lifecyclerOwner))
    yourViewGroup.addView(div2View)
    div2View.setData(divData, DivDataTag("your_unique_tag_here"))

Если все сделано без ошибок, на экране появится надпись «Hello, DivKit!».

Посмотреть интерактивный пример

Обработка действий пользователя

Чтобы сделать интерфейс интерактивным, добавьте обработку действия. Для примера превратим текст в интерактивную кнопку, при нажатии которой появится всплывающая подсказка.

Модификация JSON

В DivKit сознательно нет таких высокоуровневых сущностей, как, например, «карточка товара» или «кнопка». Кнопкой может быть любой элемент. Для этого изменим внешний вид надписи и добавим действие при нажатии:

Посмотреть интерактивный пример

В примере изменили внешний вид: добавили скругление углов и отступы, поменяли цвет фона и текста, добавили анимацию при нажатии, поменяли расположение текста внутри View. И главное — добавили действие при нажатии:

    "actions": [
        {
            "log_id": "button_pressed",
            "url": "notification://show-toast?text=Hello%2C%20DivKit%21"
        }
    ]

Поддержка нового действия на уровне кода в Android

Чтобы обрабатывать новые типы действий, нужно реализовать свою имплементацию DivActionHandler и добавить его в DivConfiguration.
Начнем с имплементации DivActionHandler:

class NotificationDivActionHandler(): DivActionHandler() {
    override fun handleAction(action: DivAction, view: DivViewFacade): Boolean {
        if (super.handleAction(action, view)) {
            return true
        }

        val uri = action.url?.evaluate(view.expressionResolver) ?: return false
        if (uri.authority != "show-toast" || uri.scheme != "notification") return false
        val text = uri.getQueryParameter("text") ?: return false
        
        Toast.makeText(view.view.context, text, Toast.LENGTH_LONG).show()
        return true
    }
}

Мы вызываем метод super.handleAction(action, view), чтобы действия по умолчанию продолжали работать. Если действие еще не обработано, пытаемся его определить и показать уведомление.

Теперь нужно добавить NotificationDivActionHandler() в конфигурацию:

    val configuration = DivConfiguration.Builder(imageLoader)
        .actionHandler(NotificationDivActionHandler())
        .build()

Так можно повлиять из JSON-верстки не только на состояние самой карточки, но и на все приложение.

Узнать больше

Следите за новостями DivKit в Telegram-канале: http://t.me/divkit_news.

Также вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.

Репозиторий DivKit

Предыдущая
Следующая