[Android Study] 뷰 이벤트

728x90
반응형

- 액티비티 화면은 뷰로 화면을 구성하고 구현한다. 이런 뷰를 터치했을 때 이벤트 처리는 앞에서 정리한 '키 이벤트, 터치 이벤트'를 이용하지 않고 따로 각 뷰에서 이벤트를 제공한다.

 

* 뷰 이벤트의 처리 구조

 - 터치 이벤트와 키 이벤트는 이벤트 콜백 함수인 onTouchEvent(), onKeyDown()만 액티비티에 선언해 놓으면 처리가 가능하다. 하지만, 뷰 이벤트는 좀 더 복잡하다. 뷰 이벤트 처리는 이벤트 소스와 이벤트 핸들러로 역할이 나뉘며 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있다.

  • 이벤트 소스(event source): 이벤트가 발생한 객체
  • 이벤트 핸들러(event handler): 이벤트 발생 시 실행할 로직이 구현된 객체
  • 리스너(listener): 이벤트 소스와 이벤트 핸드러를 연결해 주는 함수

 - 즉, 이벤트 소스에 리스너로 이벤트 핸들러를 등록해 놓으면 이벤트가 발생할 때 실행되는 구조이다. 아래 코드는 체크박스의 체크 상태가 변경될 때 이벤트 처리를 작성한 것이다. checkbox 객체가 이벤트가 발생하는 이벤트 소스이며, 이벤트 처리 내용이 담긴 이벤트 핸들러는 OnCheckedChangeListener 인터페이스를 구현한 객체이다.

 - 대부분 이벤트 핸들러는 이름 형식이 OnXXXListener인 인터페이스를 구현해서 만든다.

binding.checkbox.setOnCheckedChangeListener(object: CompoundButton.OnCheckedChangeListener) {
    override fun onCheckedChenaged(p0: CompoundButton?, p1: Boolean) {
        Log.d("체크박스 클릭")
    }
}

 

- 위의 예시처럼 인터페이스를 구현한 object 클래스를 이벤트 핸들러로 만들어도 되고, 액티비티 자체에서 인터페이스를 구현할 수도 있다. 또한, 이벤트 핸들러를 별도의 클래스로 만들어 처리할 수 있으며 코틀린의 SAM기법을 이용할 수도 있다. 어떻게 작성하든 지정된 인터페이스를 구현한 객체를 이벤트 핸들러로 등록한다는 점은 같다.

// 액티비티에서 인터페이스를 구현한 예
class MainActivity: AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        val binding = ~~~ (생략)
		
        binding.checkbox.setOnCheckedChangeListener(this)
    }
    override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
    	Log.d("체크박스 클릭")
    }
}
// 이벤트 핸들러를 별도의 클래스로 만든 예
class MyEventHandler: CompundButton.OnCheckedChangeListener {
    override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
    	Log.d("체크박스 클릭")
    }
}

class MainActivity: AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        val binding = ~~~ (생략)
		
        binding.checkbox.setOnCheckedChangeListener(MyEventHandler())
    }
}
// SAM 기법으로 구현한 예
class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        val binding = ~~~ (생략)
		
        binding.checkbox.setOnCheckedChangeListener {
            compoundButton, b ->
            Log.d("체크박스 클릭")
        }
    }
}

 

* 클릭과 롱클릭 이벤트 처리

- 뷰를 짧게 클릭할 때 발생하는 ClickEvent와 길게 눌렀을 때 발생하는 LongClickEvent가 있다. 두 이벤트는 뷰의 최상위 클래스인 View에 정의된 이벤트이다. 즉, 가장 기초이면서 많이 이용하는 이벤트이다. 두 이벤트의 핸들러는 다음과 같다.

  • open fun setOnClickListener(l: View.OnClickListener?): Unit
  • open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit
binding.button.setOnClickListener {
    Log.d("클릭 이벤트")
}

binding.button.setOnLongClickListener {
    Log.d("롱 클릭 이벤트")
    true
}

 

728x90
반응형
TAGS.

Comments