์์ฑ์ผ: 2019.11.28
์ฝํ๋ฆฐ ํ์ฅ ํจ์๋ฅผ ํตํด View ๋๋ธ ํด๋ฆญ ๋ฐฉ์ง๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ณดํต ๋๋ธ ํด๋ฆญ ๋ฐฉ์ง๋ฅผ ์ํด ํน์ ์๊ฐ์ ์ ํด๋๊ณ ํ ๋ฒ ํด๋ฆญ ํ ํด๋น ์๊ฐ ์ด๋ด์ ํด๋ฆญ ์ด๋ฒคํธ๋ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ง์ ์ ์ญ Util ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ฑฐ๋ RxBinding์ throttle์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
Util ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ onClick()๋ง๋ค boilerplate๊ฐ ์๊ธฐ๊ฒ ๋๊ณ , ๊น๋นกํ๊ณ ์ถ๊ฐ๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ๋ ์๊ธฐ๊ธฐ ์ฝ์ต๋๋ค.
backButton.setOnClickListener {
if (ExampleUtils.isDoubleClick()) return@setOnClickListener
onBackPressed()
}
RxBinding ์ฌ์ฉ ๋ํ clicks()์ ํจ๊ป throttle()๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๊ฒ์ ๊น๋นกํ ์ ์๊ณ , 3rd party ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
backButton.clicks()
.throttleFirst(500, TimeUnit.MILLISECONDS)
.subscribe { onBackPressed() }
Kotlin ํ์ฅ ํจ์๋ก ๋๋ธ ํด๋ฆญ ๋ฐฉ์ง ๊ตฌํํ๊ธฐ
1. ClickListener ๊ตฌํํ๊ธฐ
View.OnClickListener๋ฅผ ๊ตฌํํ์ฌ ์์์ ์ค๋ช
ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ ์ ๊ฒฝ์ฐ RxBinding์ ์ฌ์ฉํ ํ์๋ฅผ ๋๋ผ์ง ๋ชปํด์ ์ง์ ์๊ฐ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
์ฝํ๋ฆฐ์ ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์์ฑ์๋ก ์ง์ ํด๋ฆญ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ฐ๋๋ก ํ์ต๋๋ค.
class OnSingleClickListener(private val onSingleClick: (View) -> Unit) : View.OnClickListener {
companion object {
private const val CLICK_INTERVAL = 500
}
private var lastClickedTime: Long = 0L
override fun onClick(v: View?) {
if (isSafe() && v != null) {
lastClickedTime = System.currentTimeMillis()
onSingleClick(v)
}
}
private fun isSafe(): Boolean {
return System.currentTimeMillis() - lastClickedTime > CLICK_INTERVAL
}
}
2. ํ์ฅ ํจ์ ์ ์ํ๊ธฐ
๋ง์ฝ ํ์ฅ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, View.setOnClickListener๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค OnSingleClickListener๋ฅผ ์์ฑํ์ฌ ๋ฃ์ด์ค์ผ ํฉ๋๋ค.
fun View.setOnSingleClickListener(onSingleClick: (View) -> Unit) {
val singleClickListener = OnSingleClickListener { onSingleClick(it) }
setOnClickListener(singleClickListener)
}
3. ์ฌ์ฉํ ๋๋ setOnClickListener์ฒ๋ผ ์ฌ์ฉํด์.
์ค์ ๋ก View์์๋ ๊ธฐ์กด setOnClickListener๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์ธ ์ ์์ต๋๋ค.
textView.setOnSingleClickListener { onClickItem() }
์ด๋ ๊ฒ ์ฐ๋๋ผ๋ setOnSafeClickListener ๋์ ๊ทธ๋ฅ setOnClickListener๋ฅผ ์ฌ์ฉํด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ถ๋ช
ํ ์์ ์ ์์ต๋๋ค.
ํ์ง๋ง refactor tool(ctrl + shift + r)์ ์ด์ฉํด setOnClickListener๋ฅผ setOnSafeClickListener๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๋ณด๋ค ์์ ์ด ๋น๊ต์ ํธ๋ฆฌํฉ๋๋ค.
์ถ๊ฐ๋ก ํ์ฅ ํจ์๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ข
๋ฅ๋ณ๋ก Extention Function์ ๋ชจ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ViewExtentions ์๋ View ๊ด๋ จ ํ์ฅ ํจ์๋ค / CollectionExtensions์๋ collection ๊ด๋ จ ํ์ฅ ํจ์๋ค ์ด๋ ๊ฒ์. ํ์ฅ ํจ์๊ฐ ๋์ด๋๋ค๋ฉด, TextViewExtensions, ButtonExtensions / ListExtensions, MapExtensions ๋ฑ ์ฒ๋ผ ๋ ์์ธํ๊ฒ ์ชผ๊ฐค ์๋ ์์ต๋๋ค.
์ด์ธ์๋ ํ์ฅ ํจ์๋ฅผ ์ ํ์ฉํ๋ค๋ฉด ์ด๋ฆ์ฒ๋ผ ํ์ฅ์ฑ์๋ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค!!