如何重构具有3个类似方法的onButtonClick?

时间:2019-10-13 21:22:43

标签: android kotlin android-intent android-activity refactoring

以下代码完全符合我的要求。

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?

1 个答案:

答案 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())
        })
    })
}