[Android] 버튼 연속 클릭 방지

Twaun·2022년 7월 7일
0

Android

목록 보기
10/24

버튼 연속 클릭 방지의 필요성

사용자가 버튼을 빠르게 연속으로 클릭되는 것을 막을 필요가 있다.

사용자의 급하게 바로바로 넘어가고 싶거나, 악의적으로 매우 빠른 속도로 버튼을 누를 수 있다.

이는 API를 빠르게 연속으로 보내 비효율적이고 에러를 발생할 수 있다. 또 이동과 관련된 버튼일 때는 동일한 Activity나 fragment가 2개 이상 띄어질 수 있다.

어떻게 막을 것인가?

버튼을 클릭할 때의 순간 시간을 재서 이전 기록된 시간과 비교해서 간격이 너무 짧으면 현재 클릭 무효시키는 방법이 있다.

View.OnClickListener 를 상속하는 클래스와 이 클래스를 사용하는 확장함수 View.setOnSingleClickListener 를 구현해 버튼 컴포넌트에서 사용할 수 있게 할 것이다.

클래스

구현은 간단하다. 버튼 클릭할 때의 시간과 이전에 클릭한 시간을 비교해서 간격이 특정 이상 되어야 콜백함수를 실행한다.

class OnSingleClickListener(
    private val onClickListener: (view: View) -> Unit
) : View.OnClickListener{

    companion object {
    	// 버튼 사이에 허용하는 시간간격
        const val INTERVAL = 200L
    }

	// 이전 클릭 시간 기록
    private var lastClickedTime = 0L

    override fun onClick(view: View) {
    	// 클릭 시간
        val onClickedTime = SystemClock.elapsedRealtime()
        // 간격보다 작으면 클릭 no
        if ((onClickedTime-lastClickedTime) < INTERVAL) { return }

        lastClickedTime = onClickedTime
        onClickListener.invoke(view)
    }
}

확장함수

OnClickListener 를 구현한 클래스를 호출하는 View 확장함수이다.

fun View.setOnSingleClickListener(
    onClickListener: (view: View) -> Unit
) {
    setOnClickListener(OnSingleClickListener(onClickListener))
}

사용

위 확장함수를 기존 버튼에서 사용하던 setOnClickListener과 같이 setOnSingleClickListener를 사용하면 된다.

binding.btnCreate.setOnSingleClickListener {
	// 구현
}
profile
Android Developer

0개의 댓글