뷰 이벤트

Hyeon·2023년 4월 18일
0

Android

목록 보기
9/15

뷰를 사용자가 터치했을 때 터치 이벤트를 사용하지 않고 뷰 이벤트를 사용한다. 터치 이벤트를 사용할 경우 사용자가 터치한 뷰가 어느 뷰인지 좌푯값으로 판단해야하기 때문에 너무 복잡하기 때문이다.

뷰 이벤트의 처리 구조

터치 이벤트와 키 이벤트와는 달리, 뷰 이벤트는 콜백 함수만 선언해서는 처리할 수 없다. 뷰 이벤트는 이벤트 소스(event source)이벤트 핸들러(event handler)로 역할이 나뉘고, 이 둘을 리스너(listener)로 연결해야 이벤트를 처리할 수 있다.

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

뷰 이벤트 처리 방법

방법 1

아래 코드는 id가 checkbox1 인 체크 박스가 체크 상태로 변경될 때 이벤트 처리 함수이다. 여기서 이벤트 소스는 checkbox1 객체이고, setOnCheckedChangeListener가 리스너이다. 이벤트 핸들러는 OnCheckedChangeListener 인터페이스를 구현한 object 클래스이다.

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

방법 2

액티비티 자체에서 인터페이스를 구현하는 방법이다.

class MainActivity : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.checkbox1.setOnCheckedChangeListener(this)
    }

    override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
        Log.d("kkang", "체크박스1 클릭")
    }
}

방법 3

이벤트 핸들러를 별도의 클래스로 만들어 처리하는 방법이다.


class MyEventHandler : CompoundButton.OnCheckedChangeListener {
    override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
        Log.d("kkang", "체크박스1 클릭")
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.checkbox1.setOnCheckedChangeListener(MyEventHandler())
    }
}

방법 4

코틀린의 SAM 기법을 이용하는 방법이다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        var binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.checkbox1.setOnCheckedChangeListener{
            compoundButton, b ->
            Log.d("kkang", "체크박스1 클릭")
        }
    }
}

SAM(Single Abstract Method)란? 코틀린에서 자바 인터페이스를 간단하게 사용하기 위해 제공하는 기법이다.

클릭과 롱클릭 이벤트 처리

클릭 이벤트와 롱클릭 이벤트는 뷰의 최상위 클래스인 View 에 정의된 이벤트이다.

클릭 이벤트 (ClickEvent)

  • 이벤트 핸들러 :
    open fun setOnClickListener(l: View.OnClickListener?): Unit

클릭 이벤트 처리

binding.button1.setOnClickListener{
	Log.d("kkang", "button1 클릭 이벤트")
}

롱클릭 이벤트 (LongClickEvent)

  • 이벤트 핸들러 : open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit

롱클릭 이벤트 처리

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

LongClickEvent 의 콜백 함수는 아래처럼 정의되어 있다.

abstract fun onLongClick(v: View!):Boolean

반환값이 Boolean 이기 때문에 이벤트 콜백 함수의 맨 마지막 줄에 true나 false를 리턴해주어야 한다.

참고자료

  • Do it 안드로이드 도서
profile
컴공학부생입니다.

0개의 댓글