Event Handling...
DataBinding을 통해서 EventHandling은 어떻게 할까요.
단순히 binding된 view들을 가지고 setOnClickListener나 setOnLongClickListener의 interface를 구현해도 됩니다. 가장 일반적인 방법일 수도 있지만 DataBinding을 통한 handling은 어떻게 할 수 있을까요.
ButterKnife는?
ButterKnife에서는 view 의 id를 가지고 @OnClick이라는 annotation을 통해 click event를 handling합니다.
OnClickListener 라는 interface를 통해 override된 onClick메소드에서 구현하는게 아닌 방법입니다. view마다 event를 독립적으로 줄 수 있어서 뭔가... 깔끔하다고 해야 할까요?
DataBinding에서는??
DataBinding에서는 view의 xml에서 onClick부분에다가 해당 method를 바로 지정해서 사요할 수 있습니다.
위 그림에서와 같이 android:onClick에다가 @{handler.onChangeTitleClick} 으로 바로 event handling할 method를 바로 지정했습니다. onChangeTitleClick과 같은 메소드 인데.. handler는 무엇일까요??
맨 위에 <data></data> tag안에 variable로 지정된 부분입니다. event handling할 내용들을 모두 MainEventHandler라는 곳에 담아 두고 그 이름을 handler라고 지정한 것입니다.
저는 MainEventHandler는 interface로 만들었지만 class가 되어도 상관은 없습니다..
구현 부분을 보면 <data></data> tag안에 있던 variable을 지정하면 binding된 부분에 해당 variable name으로 만들어 진 것을 set 해줘야 사용할 수 있습니다. 이 부분이 interface로 하면 위와 같이 하면 되고, class가 된다면 new해서 사용하면 되니까요.
아직 Model을 직접 binding한 부분은 예제로 안다뤘지만... 이 부분도 variable을 통해서 name을 지정하고, setText하는 부분을 android:text="@{name.methd}" 와 같이 사용하기 때문에 큰 어려움은 없다고 생각합니다. 단... 화면 view에서 사용하는 model이 한두개가 아닐 땐... 사실 이 방법이 좋다고 생각 되진 않아요. 오히려 관리해야 할 부분으 더 생기니.. 복잡도가 올라간다고 해야 할까요?? 그냥 제 생각입니다.
이 예제는
https://github.com/drcarter/DataBindingSample
을 보시고 참고 하셔도 됩니다.
예제는 DataBinding + Dagger2 + MVP 로 진행된 것입니다.
Dagger2와 MVP는 요즘 제가 또한 관심을 많이 가지고 있는 부분이기도 해서 :-)