以下代码完全符合我的要求。
fun onButtonClick(@Suppress("UNUSED_PARAMETER") v: View) {
val intent = Intent(this, ImageActivity::class.java)
val bundle = Bundle()
orangeButton.setOnClickListener{
val parcel:ImageUrl = IMAGE_URL_ORANGE
bundle.putParcelable("key", parcel)
intent.putExtra(IMAGE_BUNDLE_NAME, bundle)
startActivity(intent)
}
redButton.setOnClickListener{
val parcel:ImageUrl = IMAGE_URL_RED
bundle.putParcelable("key", parcel)
intent.putExtra(IMAGE_BUNDLE_NAME, bundle)
startActivity(intent)
}
greenButton.setOnClickListener{
val parcel:ImageUrl = IMAGE_URL_GREEN
bundle.putParcelable("key", parcel)
intent.putExtra(IMAGE_BUNDLE_NAME, bundle)
startActivity(intent)
}
}
问题在于这三种情况下的行为几乎相同。我该如何重构?我尝试了以下操作,但它导致应用程序崩溃。
fun onButtonClick(@Suppress("UNUSED_PARAMETER") v: View) {
val intent = Intent(this, ImageActivity::class.java)
val bundle = Bundle()
lateinit var parcel:ImageUrl
orangeButton.setOnClickListener{
parcel = IMAGE_URL_ORANGE
}
redButton.setOnClickListener{
parcel = IMAGE_URL_RED
}
greenButton.setOnClickListener{
parcel = IMAGE_URL_GREEN
}
bundle.putParcelable("key", parcel)
intent.putExtra(IMAGE_BUNDLE_NAME, bundle)
startActivity(intent)
}
我可能应该使用某种IF语句,但是如何找到被单击按钮的ID?
答案 0 :(得分:1)
这是实现它的一种方法。基本上,我们使用按钮View
id将其映射到您的ImageUrl
。当用户单击按钮时,我们将检索与该按钮相对应的ImageUrl
:
val imageUrlMap: Map<Int, ImageUrl> = mapOf(
orangeButton.id to IMAGE_URL_ORANGE,
redButton.id to IMAGE_URL_RED,
greenButton.id to IMAGE_URL_GREEN,
)
fun onButtonClick(@Suppress("UNUSED_PARAMETER") v: View) {
orangeButton.setOnClickListener(::onColoredButtonClicked)
redButton.setOnClickListener(::onColoredButtonClicked)
greenButton.setOnClickListener(::onColoredButtonClicked)
}
fun onColoredButtonClicked(button: View) {
startActivity(Intent(this, ImageActivity::class.java).apply {
putExtra(IMAGE_BUNDLE_NAME, Bundle().apply {
putParcelable("key", imageUrlMap[button.id])
})
})
}
如果您不想分配Map<Int, ImageUrl>
,我们可以使用内联扩展功能和lambda进行相同操作:
fun onButtonClick(@Suppress("UNUSED_PARAMETER") v: View) {
orangeButton.onColoredButtonClicked { IMAGE_URL_ORANGE }
redButton.onColoredButtonClicked { IMAGE_URL_RED }
greenButton.onColoredButtonClicked { IMAGE_URL_GREEN }
}
inline fun Button.onColoredButtonClicked(imageUrlFunc: (Int) -> ImageUrl) {
startActivity(Intent(this, ImageActivity::class.java).apply {
putExtra(IMAGE_BUNDLE_NAME, Bundle().apply {
putParcelable("key", imageUrlFunc())
})
})
}