[Android] 이벤트 리스너를 이해해보자

Choi Sang Rok·2022년 2월 23일
0
post-custom-banner

CallBack 메서드에 대해 보고 오시면 더 좋습니다.
https://velog.io/@evergreen_tree/Android-Call-Back-%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80

이벤트 리스너를 사용하거나 나 비동기 처리를 하는 경우 콜백 함수가 필요한 상황이 생긴다.

위 그림에서 보다시피, “버튼 클릭이 일어났을 때” 사용자가 지정한 동작이 일어나야 하기 때문이다.

이를 전체적으로 이해하기 위해, 이벤트 처리에 대한 코드를 직접 만들어 나가면서 설명하겠다.

💡 해당 글의 코드는 임의로 작성한 것이고, 절대로 실제 내부 코드와 일치하지 않음을 알립니다.

1. Listener 구현


Listener : 뷰 에서 발생하는 이벤트에 대해 작업을 처리해 주는 곳

OnClickListener → 클릭에 대한 작업을 처리해 주는 곳, MouseMotionListener → 마우스 동작에 대한 작업을 처리해 주는 곳을 말할 것이다.

Listener는 작업을 처리해 주는 곳이니까, 어떤 작업을 처리하는 지 명시해야 할 것이다.

또한, 어떤 개발자가 어떤 작업을 처리하려고 할 지 모르기 때문에, 인터페이스로 선언해야 할 것이다.

interface OnClickListener{ //뷰 에서 발생하는 클릭 이벤트의 작업을 처리해주는곳
    fun onClick() //클릭에 대한 작업을 처리
}

2. setOnClickListner 구현


class Button{
    lateinit var mOnclickListener : OnClickListener
    fun setOnClickListener(onClickListener: OnClickListener){
        this.mOnclickListener = onClickListener
    }
}

뷰에는 리스너의 구현체를 저장할 변수 mOnclickListener를 선언한다.

setOnclickListener 메서드를 작성하여, onClickListener 인터페이스의 구현체를 인수로 받아 저장한다.

3. 이벤트 등록 및 테스트


여러 방법이 있지만, 가장 정석적인 방법 두가지로 이벤트를 등록하려고 한다.

1. Listener를 상속받은 클래스 구현

class myClickListener : OnClickListener{
    override fun onClick() {
				println("버튼 누름")
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val button = Button()
        button.setOnClickListener(new myClickListener())
        
  }

2. 무명 클래스를 사용하여 구현

val button = Button()
button.setOnClickListener(object : OnClickListener {
    override fun onClick() {
				println("버튼 누름")
    }
})

인터페이스의 구현체, 즉 인터페이스의 메서드들의 동작을 구현하여 전달함으로써, Button 클래스는 클릭 명령을 받았을 때 구현체의 onClick을 호출하면 된다.

버튼을 클릭한다고 가정하는 userClick()

class Button{
    lateinit var mOnclickListener : OnClickListener
    
		fun setOnClickListener(onClickListener: OnClickListener){
        this.mOnclickListener = onClickListener
    }

    **fun userClick(){
        mOnclickListener?.let{
            it.onClick()
		}**
	}
}

참고 블로그
https://drcode-devblog.tistory.com/193

profile
android_developer
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 2월 23일

소고기 스테이크 이벤트는 없을까요??

답글 달기