Android databinding: onClick -> startActivity
Есть кнопка внутри фрагмента. После нажатия на кнопку мы должны создать интент и запустить новую активность. Вопрос: как это правильнее сделать с точки зрения архитектуры?
До databinding это было сделано прямо внутри фрагмента - на кнопку навешивался onClickListener, внутри которого всё и происходило. А как это лучше сделать с databinding? Есть вариант передать в разметку фрагмента activity и viewModel, затем в onClick кнопки сделать
android:onClick="@{() -> viewModel.openActivity(activity)}"
но стартовать интенты из viewModel - это плохая практика.
Ответы (1 шт):
Я бы ничего не передавал в разметку. Я обрабатываю нажатие как раньше (в листинге фрагмента или активити)
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>