안드로이드 다중 클릭 방지(Prevent Multiple Click)

화면 이동이나 특정 API 호출을 할 때 안드로이드 자체에서 다중 클릭을 막아 주지 않기 때문에 따로 처리가 필요하다.
그래서 회사 팀원들과 같이 의견을 조금씩 반영하다 보니 좋은 결과물이 나온것 같다. ㅎㅎ
소스는 아래와 같다.

var isClicked = false

//데이터 바인딩에서 사용하기 위한 fun
@BindingAdapter("app:onThrottleFirstClick", "app:onThrottleInterval", requireAll = false)
fun onThrottleFirstClick(
    view: View,
    onClickListener: View.OnClickListener,
    isWithoutInterval: Boolean = false
) {
    view.setOnClickListener { v ->
        if (isClicked.not()) {
            isClicked = true
            v?.run {
                if (isWithoutInterval) {
                    isClicked = false
                    onClickListener.onClick(v)
                } else {
                    postDelayed({
                        isClicked = false
                    }, 350L)
                    onClickListener.onClick(v)
                }
            }
        }
    }
}

//일반 뷰에서 사용할 수 있는 Kotlin Extension
fun View.onThrottleFirstClick(interval: Long = 350L, action: (v: View) -> Unit) {
    setOnClickListener { v ->
        if (isClicked.not()) {
            isClicked = true
            v?.run {
                postDelayed({
                    isClicked = false
                }, interval)
                action(v)
            }
        }
    }
}

xml Layout 코드(Before)

기존 onClick 구현 방식

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{(v)-> 어떤 처리}"
    android:text="일반 클릭"
/>

위와 같이 onClick을 사용하면 다중 클릭을 막을 수 없고 버튼을 여러번 클릭 하는 경우 어떤 처리가 여러번 처리 된다.
아래 다중클릭이 방지된 BindingAdapter 를 사용하게 되면 여러번 클릭을 막을 수 있다.
onThrottleInterval 은 싱글 클릭이 필요 없는 경우에만 넣어주면 된다.
예를 들어 옵션의 카운트 갯수를 올려주는 행위에 사용하면 된다.

xml Layout 코드(After)

변경된 방식

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="싱글 클릭"
        app:onThrottleInterval="@{불린값}"
        app:onThrottleFirstClick="@{(v) -> 어떤 처리}"
        />

button을 가지고 있는 클래스(Before)

button.setOnClickListener {
    //어떤 처리
}

button을 가지고 있는 클래스(After)

button.onThrottleFirstClick {
    //어떤 처리
}

사용법도 크게 차이가 없어서 편하게 사용할 수 있게 만들어진 것 같다.