관리 메뉴

꿀맛코딩

Android databinding common click Listener for block double click(안드로이드 데이터 바인딩 더블 클릭 방지 공용 클릭 리스너 ) 본문

공부방/Android

Android databinding common click Listener for block double click(안드로이드 데이터 바인딩 더블 클릭 방지 공용 클릭 리스너 )

soycrab 2021. 1. 11. 14:23

앱을 만들다 보면 

특정 버튼을 사용자가 너무 빨리 눌러서 

뜻하지 않은 상황을 방지하고 싶을 때가 있습니다.

 

하지만 문제는 이미  클릭 이벤트를 적용한 상태에서 어떻게 최대한 코드 수정을 줄이고 적용하는가입니다.

 

만약 databinding을 사용하고 있다면 아래의 코드를 참고해 봅시다.

 

OnDoubleClickBlockClickListener.kt

class OnDoubleClickBlockClickListener(private val clickListener: View.OnClickListener, private val interval: Long = 1000) : View.OnClickListener {
    private var clickable = true
    override fun onClick(view: View?) {
        if (clickable) {
            clickable = false
            GlobalScope.launch {
                delay(interval)
                clickable = true
            }
            clickListener.onClick(view)
        } else {
            Log.i("MyLog", "waiting for a while")
        }
    }
}

ViewBindingAdapter.kt

@BindingAdapter("android:onClick")
fun OnDoubleClickBlock(view: View, listener: View.OnClickListener) {
    view.setOnClickListener(OnDoubleClickBlockClickListener(listener))
}

 

사용 예시 

<androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/sign_up"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{(v) -> customFunction()}"/>

 

위처럼 기존 onClick을 그대로 사용 유지하면서 

연속 클릭을 막을 수 있기 때문에 

쉽게 적용이 가능하다. 

 

만약 데이터 바인딩을 사용하지 않는다면 

아래처럼도 사용 가능하다.

 

ViewClickExtensions.kt

fun View.OnDoubleClickBlockClick(action: (v: View) -> Unit) {
    val listener = View.OnClickListener { action(it) }
    setOnClickListener(OnThrottleClickListener(listener))
}

 

사용 예시

MainActivity.kt 

tv_main.OnDoubleClickBlockClick({
            yourFunction()
        })

 

위의 기능을 가지고 여러 형태로 클릭 이벤트를 프로젝트에 자연스럽게 녹여낼 수 있으니 

잘 사용하시길 바랍니다. 

반응형
Comments