Butterknife

안드로이드 앱을 구현하다보면 동일한 소스의 반복이 매우 잦아짐을 알 수 있다. 예를 들면 다음과 같은 레이아웃 xml에 세팅된 view를 Activity나 fragment등에서 bind하고 처리(터치, 클릭 등 제스쳐나 액션과 관련된 것들) 하는 메소드를 implement하는 내용일 것 이다.

위는 일반적으로 구현된 버튼의 액션과, 입력된 텍스트의 비어있는지 여부등에 따라서 에러메시지를 출력하는 간단한 처리 소스이다. 자세히 보면 ‘findViewById()’같은 메소드가 반복적으로 사용되고 있으며 binding처리 된 뷰의 클릭 이벤트 처리를 ‘View.OnClickListener’의 ‘onClick()’메소드 내부에서 처리 함을 알 수 있다.

만약 여기에서 다른 뷰들이 추가 되면 어떻게 될까? 또 다시 findViewById()메소드를 콜 하여 레이아웃의 뷰를 인스턴스화 하여 바인딩 하고 처리 이벤트에 따라서 onClick()메소드에 리소스고유 아이디에 따른 처리와 메소드를 복잡하게 명시 해 줘야 할 것이다.

이러한 반복되는 소스들을 최대한 억제하고 간결화 시켜 가독성을 높이고 시간적 비용을 줄이는  ‘ButterKnife‘라는 라이브러리가 있다.  ButterKnife를 적용하면 위의 소스는 아래와 같이 정리 된다.

Activity의 onCreate()메소드의 내용이 깔끔 해 졌다. 계속 반복되던 findViewById()와 이를 통해서 바인드 처리된 뷰는 Annotation을 통해서 bind처리 하고 있음을 확인 할 수 있다. 또한 getString()을 통해서 가져왔던 문자열 리소스도 bindString 어노테이션을 통해서 깔끔하게 정리 된다. 그리고 onClickListener을 구현하여 onClick()메소드를 통한 이벤트 처리가 @onClick 어노테이션을 통해서 바로 처리 메소드를 사용 하게 됨을 확인 할 수 있다. 만약 다른 뷰를 이 메소드에 클릭이벤트를 바인딩 하고 싶다면 @OnClick의 괄호안에 리소스 아이디를 기입 하면 된다.

한눈에 보기에도 소스의 가독성이 좋아졌으며, 구현도 간단해졌다. ButterKnife를 사용하기 위한 과정은 다음과 같다.

 

1. 프로젝트의 build.gradle의 buildscript 설정

프로젝트의 build.gradle에 위 내용을 찾아서 기입 한다.

 

2. 앱 build.gradle에 plugin 설정 및 디펜던시 추가

앱의 build.gradle에 플러그인의 추가및 디펜던시를 추가 해 준다.

 

소스의 간결화및 가독성의 증가로 인해 RxAndroid와 Retrolambda랑 같이 사용을 해볼 생각이다.

 

You may also like

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.