Как провести рефакторинг onButtonClick, используя 3 аналогичных метода? - PullRequest
2 голосов
/ 14 октября 2019

Следующий код делает именно то, что я хочу.

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, но как мне найти идентификатор нажатой кнопки?

1 Ответ

1 голос
/ 14 октября 2019

Это один из способов его реализации. В основном мы используем кнопку 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>, мы можем сделать то же самое с помощью встроенной функции расширения. и лямбда:

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())
        })
    })
}
...