8-2 뷰 이벤트

StrayCat·2022년 10월 8일
0

뷰이벤트

  • 각 뷰에는 별로의 이벤트를 제공해서 터치 이벤트 처리를 한다.
  • 뷰 이벤트는 이벤트 소스이벤트 핸들러로 역할이 나뉘며 이 둘을 리스너로 연결해야 한다.
    • 이벤트 소스 : 이벤트가 발생한 객체
    • 이벤트 핸들러 : 이벤트 시 실행할 로직이 구현된 객체
    • 리스너 : 위 둘을 연결해 주는 함수
  • 이벤트 소스에 리스너로 이벤트 핸들러를 등록해 놓으면 실행되는 구조이다.
        binding.checkBox.setOnCheckedChangeListener(object:CompoundButton.OnCheckedChangeListener{
            override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
                Log.d("lumine", "check changed")
            }
        })
  • 대부분의 이벤트 핸들러는 On~~~Listener 의 인터페이스를 구현해서 만들게 된다.
  • 구현하는 방법은 아래와 같이 4가지가 있다.
    • 인터페이스를 구현한 object 클래스로 이벤트 핸들러 만들기
    • 액티비티 자체에서 인터페이스 구현
    • 이벤트 핸들러를 별도의 클래스로 만들기
    • 코틀린의 SAM(single abstract method, 자바 인터페이스 사용 기법) 기법으로 만들기

(주로 사용하는 SAM 기법)

        binding.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
            Log.d("lumine","check changed")
        }

클릭과 롱클릭

        binding.checkBox.setOnLongClickListener {
            Log.d("lumine", "long click")
            true // 반환값 필요
        }

        binding.checkBox.setOnClickListener {
            Log.d("lumine", "click")
        }

Java로 작성한 이벤트 핸들러

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

위 코드를 그대로 코틀린으로 전환

        binding.checkBox.setOnClickListener(object: View.OnClickListener{
            override fun onClick(v: View?) {
            }
        })

SAM 기법

        binding.checkBox.setOnClickListener {
            
        }

SAM 기법

  • 자바 API를 코틀린에서 활용할 때 람다 표현식으로 쉽게 이용할 수 있게 해주는 기법
  • 하나의 추상 함수를 포함하는 인터페이스를 활용하는 방법
public interface JavaInterface1{
	void callback();
}
public class SAMTest{
	JavaInterface1 callback;
    public void setInterface(JavaInterface1 callback){
    	this.callback = callback;
	}
}

이를 그대로 코틀린에서 사용한다면 아래와 같이 사용해야한다.

obj.setInterface(object: JavaInterface1{
	override fun callback() {
    	println("asdf")
    }
})

하지만 위와 같이 callback()을 포함하는 JavaInterface1 인터페이스가 있고, 여기에 setter 함수도 자바에 작성되어 있으면
코틀린에서 아래와 같이 람다함수를 통해 쉽게 사용할 수 있다.

obj.setInterface { println("asdf") }

0개의 댓글