본문 바로가기
Kotlin

[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 뷰 이벤트

by 쀼르쀼르 2024. 3. 6.

08-2 뷰 이벤트


 

뷰 이벤트의 처리 구조

뷰 이벤트는 일정한 구조에 따라 처리됨

뷰 이벤트는 이벤트 콜백 함수만 서언해서는 처리할 수 없음

 

뷰 이벤트 처리는 이벤트 소스(event source)이벤트 핸들러(event handler)로 역할이 나뉘며

이 둘을 리스너(listener)로 연결해야 이벤트를 처리할 수 있음

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

즉, 이벤트 소스에 리스너로 이벤트 핸들러를 등록해 놓으면 이벤트가 발생할 때 실행되는 구조임

 

· 체크박스 이벤트 처리

 

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

대표적으로 OnClickListener, OnLongClickListener, OnItemClickListener 등의 인터페이스 제공함

· 액티비티에서 인터페이스를 구현한 예

class MainActivity3 : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        val binding = ActivityMain3Binding.inflate(layoutflater)
        setContentView(binding.root)
        binding.checkbox.setOnCheckedChangeListener(this)
    }
    override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
    	Log.d("kkang", "체크박스 클릭")
    }
}

· 이벤트 핸들러를 별도의 클래스로 만든 예

class MyEventHandler : CompoundButton.OnCheckedChangeListener {
	override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
    	Log.d("kkang", "체크박스 클릭")
    }
}
class MainActivity3 : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        val binding = ActivityMain3Binding.inflate(layoutflater)
        setContentView(binding.root)
        
        
        binding.checkbox.setOnCheckedChangeListener(MyEventHandler())
    }
}

· SAM 기법으로 구현한 예

class MainActivity3 : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        
        val binding = ActivityMain3Binding.inflate(layoutflater)
        setContentView(binding.root)
        
        binding.checkbox.setOnCheckedChangeListener {
        	compoundButton, b ->
            Log.d("kkang", "체크박스 클릭")
        }
    }
}

 


 

클릭과 롱클릭 이벤트 처리

ClickEvent

- 뷰를 짧게 클릭할 때 발생함

- 핸들러

  • open fun setOnClickListener(l: View.OnClickListener?): Unit

 

LongClickEvent

- 뷰를 길게 클릭할 때 발생함

- 핸들러

  • open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit

 

ClickEvent, LongClickEvent는 뷰의 최상위 클래스인 View에 정의된 이벤트임

ClickEventOnClickListener를 구현한 객체를 이벤트 핸들러로 등록해야 함

LongClickListenerOnLongClickListener를 구현한 객체를 이벤트 핸들러로 등록해야 함

 

· 버튼의 클릭, 롱클릭 이벤트 처리

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

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

 

· 자바로 작성한 이벤트 핸들러

binding.btn.setOnClickListener(new View.OnClickListener() {
	@Override
    public void onClick(View view) {
    }
});

 

· 코틀린으로 작성한 이벤트 핸들러

binding.btn.setOnClickListener(object: View.OnClickListener {
	override fun onClick(p0: View?) {
    }
})

· SAM 기법을 이용한 이벤트 핸들러 구조

binding.btn.setOnClickListener {
	(...생략...)
}

 

추상 함수 하나를 포함하는 인터페이스만 SAM 기법으로 이용할 수 있음

 

* SAM(single abstract method) : 코틀린 코드에서 자바 인터페이스를 간단하게 사용하기 위해 제공하는 기법