Android databinding: onClick -> startActivity

Есть кнопка внутри фрагмента. После нажатия на кнопку мы должны создать интент и запустить новую активность. Вопрос: как это правильнее сделать с точки зрения архитектуры?

До databinding это было сделано прямо внутри фрагмента - на кнопку навешивался onClickListener, внутри которого всё и происходило. А как это лучше сделать с databinding? Есть вариант передать в разметку фрагмента activity и viewModel, затем в onClick кнопки сделать

android:onClick="@{() -> viewModel.openActivity(activity)}"

но стартовать интенты из viewModel - это плохая практика.


Ответы (1 шт):

Автор решения: Vlad Orlinskas

Я бы ничего не передавал в разметку. Я обрабатываю нажатие как раньше (в листинге фрагмента или активити) binding.viewButton.setOnClickListener { }. Насколько я понимаю viewModel не должна заниматься открытием activity. Можно сделать красиво с помощью аннотации @BindingAdapter

вот например как я открываю ссылку с помощью WebViewActiity

@BindingAdapter("openLink")
fun openLink(view: View, link: WebViewActivity.Link) {
    view.setOnClickListener {
        view.context.startActivity(Intent(Intent.ACTION_VIEW,Uri.parse(link.url)))
    }
}

Как это выглядит в разметке:

        <TextView
            android:id="@+id/textAds"
            style="@style/Text.Link"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="@string/label_ads"
            android:background="?attr/selectableItemBackground"
            app:openLink="@{Link.ADS}" />

Такой подход оправдан, теперь я могу быстро повторить поведение по нажатию на текст-ссылку, всего одной строкой app:openLink="@{ссылка}".

Databinding призван ускорить разработку, очень удобно стало работать со списками передавая сущность в разметку элемента.

    <data>
        <variable
            name=""
            type="" />
    </data>
→ Ссылка