엄코딩의 개발 일지

 이벤트 처리


데이터 바인딩을 사용하여 뷰에서 발송되는 이벤트를 처리하는 식을 작성할 수 있습니다. ( 예를 들면 onClick )


이벤트 특성 이름은 몇 가지 예외를 제외하면 리스너 메소드의 이름에 따라 결정됩니다.


예를 들어, View.OnLongClickListener 에는 메소드 onLongClick()이 있으므로, 이 이벤트에 대한 특성은 


android:onLongClick 입니다.


데이터 바인딩에서 이벤트를 처리하는 두 가지 방법이 있습니다.


- 메소드 참조


- 리스너 바인딩



 메소드 참조


식에서 리스너 메소드의 서명을 준수하는 메소드를 참조할 수 있습니다. 


( 코틀린 람다는 Java8 람다와 매우 유사합니다. Java8에서의 Method Reference(메소드 참조) 를 생각하시면 됩니다. )


식이 메소드 참조로 평가되면 데이터 바인딩은


메소드 참조와 소유자 객체를 리스너에 래핑하고, 대상 뷰에서 리스너를 설정합니다.


즉, 객체를 가지고 있는 소유자를 리스너로 감싸게 되고, 해당 뷰에서 리스너를 사용하게 됩니다.


식이 null로 평가되면 데이터 바인딩은 리스너를 생성하지 않고, 그 대신 null 리스너를 설정합니다.


메소드 참조는 해당 Activity에 존재하는 메소드에 android:onClick을 할당하는 것과 비슷한 방법으로


이벤트를 핸들러 메소드에 직접 바인딩 할 수 있습니다.


기존 View#onClick 특성에 비해 한 가지 주요 장점은 컴파일 시에 식이 처리되므로, 메소드가 존재하지 않거나


메소드의 서명이 올바르지 않을 경우 컴파일 시 오류를 발생시켜, 개발자가 이를 알아 차릴 수 있습니다.


메소드 참조에 대한 코드를 함께 살펴 보겠습니다.





user::onUserClick 이 부분이 메소드 참조입니다. 


해당 버튼을 클릭하게되면 User 클래스의 onUserClick메소드가 실행됩니다.



위에서 언급하였듯이, 메소드 참조는 컴파일 시점에 식이 처리됩니다. 


컴파일 시점이아니라 실제 이벤트 발생 시 식을 처리하기 위해서 리스너 바인딩을 사용해야 합니다.

처리하기 위해서 리스너 바인딩을 사용해야 합니다.


 리스너 바인딩


리스너 바인딩은 메소드 참조와 달리 이벤트 발생 시 식이 처리됩니다. 또한, 리스너 바인딩을 사용하면 임의의 데이터


바인딩 식을 실행할 수 있습니다. 이 기능은 Android Gradle Plugin for Gradle 버전 2.0 이상에서 사용 가능합니다.


메소드 참조에서는 메소드의 매개변수가 이벤트 리스너의 매개변수와 일치해야 합니다.


( 위의 예제에서는 onClick의 매개변수 view : View 를 생각하시면 됩니다. )


하지만, 리스너 바인딩에서는 반환 값만 리스너의 예상 반환 값과 일치하면 됩니다. ( void 제외 )



view는 어디가고 age 값만 받는 걸까요?


리스너는 식의 루트 요소로만 허용되는 람다 식으로 표현됩니다. 식에서 콜백이 사용될 때 데이터 바인딩이 필요한 리스너


를 자동으로 생성하고 이벤트에 등록합니다. 뷰가 이벤트를 발생시키면 데이터 바인딩이 주어진 식을 계산하게 됩니다.


정규 바인딩 식에서처럼, 이 리스너 식이 평가되는 동안 여전히 데이터 바인딩의 null 및 스레드의 안전이 보장됩니다.



위 onClick에서는 람다식을 이용하여 식을 처리했습니다. 


혹시나 view가 필요한 경우는 다음과 같이 코드를 작성할 수 있습니다.



해당 메소드의 매개 변수로 View, String 값을 버튼에서는 다음과 같이 설정할 수 있습니다.




참고 사이트 : https://developer.android.com/topic/libraries/data-binding/