Android MVVM ClickListener最佳实践



当我阅读向日葵和许多项目时,我们有实现ClickListener 的多种干净方法

  1. 在视图中绑定clicklistener(活动/片段(
  2. 在XML上为clickListener创建一个单独的变量,并在构造函数上调用它
  3. 创建一个静态方法并从XML调用它
  4. 创建一个有两种用途(模型和方法(的viewModel,并将viewModel类直接传递给XML,然后在对象上调用方法

1

binding.addPlant.setOnClickListener {
navigateToPlantListPage()
}

2

<data>
<variable
name="clickListener"
type="android.view.View.OnClickListener"/>
<variable
name="plant"
type="com.google.samples.apps.sunflower.data.Plant"/>
</data>

然后

init {
binding.setClickListener { view ->
binding.viewModel?.plantId?.let { plantId ->
navigateToPlant(plantId, view)
}
}
}

3

companion object{
@JvmStatic
@BindingAdapter("bind:setSubjectText")
fun setSubjectText(textView: TextView, string: String){
val mTxt = "Subject: ${string}"
textView.text = mTxt
}
}

4

<data>
<variable
name="viewmodel"
type="com.android.example.livedatabuilder.LiveDataViewModel" />
</data>

作为模型

<TextView
android:id="@+id/current_weather"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewmodel.currentWeather}"
tools:text="Tokyo" />

在与ViewModel方法相同的XML中

<Button
android:id="@+id/refresh_button"
android:layout_width="match_parent"
android:layout_height="56dp"
android:onClick="@{() -> viewmodel.onRefresh()}"
android:text="@string/refresh_label" />

正如你所看到的,他们每个人都有一些优点和缺点。例如每个主题:

  1. 混乱的视图
  2. 当我们想在XML中调用多对象时,XML会很混乱
  3. 在大型项目中,我们将采用许多静态方法
  4. 混乱的视图模型

问题:哪一个是实现clicklistener的最佳实践,尤其是在具有许多可点击对象的片段的大型程序中?

在我看来,你提到的方法都不好了,任何新项目都可以使用Jetpack Compose。以这种方式,您不需要片段、XML和绑定。etc

最新更新