사용자가 버튼을 빠르게 연속으로 클릭되는 것을 막을 필요가 있다.
사용자의 급하게 바로바로 넘어가고 싶거나, 악의적으로 매우 빠른 속도로 버튼을 누를 수 있다.
이는 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 {
// 구현
}