박상권의 삽질블로그

[안드로이드/Android]유용한 라이브러리 - Butter Knife (View Inject) 본문

IT/Android-TIP (한글)

[안드로이드/Android]유용한 라이브러리 - Butter Knife (View Inject)

박상권 2015.06.28 19:16

안드로이드에서 새로운 화면을 만들면서 xml레이아웃을 만든뒤 대부분 제일먼저 하는 작업이 해당 View들을 선언하고 할당하는 작업일겁니다.


보통 아래와 같이 선언하고 할당하고 리스너 또한 달아주고 계실겁니다.



View view_root;
View view_contents;
ImageButton ib_chat_photo;
EditText et_chat_input;
SelphoneSendButton btn_send;


...


view_root = findViewById(R.id.view_root);
view_contents = findViewById(R.id.view_contents);
ib_chat_photo = (ImageButton) findViewById(R.id.ib_chat_photo);
ib_chat_photo.setOnClickListener(this);
et_chat_input = (EditText) findViewById(R.id.et_chat_input);



View가 10개라면 10번 선언, 10번 findViewById를 매번 해주어야 하는 번거로움이 있습니다.

 (리스너가 필요하다면 .setOnClickListener() 까지..)




개인적으로 제가 좋아하는 개발자 JakewhartonButterk knife를 소개합니다.

(ActionBarSherlock만든 개발자)



하지만 Databinding이 출동한다면 어떨까?

[IT/Android-TIP (한글)] - [안드로이드]DataBinding - Goodbye 버터나이프 Hello 데이터바인딩

저는 개인프로젝트는 Butterknife에서 DataBinding으로 모두 갈아탔습니다.

관심있으신분은 위의 글을 읽어보셔도 좋습니다.







Butter Knife홈페이 , Butter Knife Github





Java의 Annotation을 활용한 방법입니다.

기본적인 사용방법은 아주 간단합니다.


(gradle추가)

compile 'com.jakewharton:butterknife:8.7.0'

annotationProcessor 'com.jakewharton:butterknife:8.7.0'



사실 Butterknife는 버전이 바뀔때마다 사용방식이 계속 달라졌었습니다.

@InjectView이기도 했고 @Bind이기도 했으며 현재는 @BindView입니다.

(바꾸지마 Jake형...블로그 업뎃하기 귀찮아...)


이전까지는 Butterknife라이브러리는 AnnotaionProcessor를 사용하지 않고 reflection방식으로 라이브러리를 구성했었는데 이방식은 속도저하의 우려가 있습니다.

8버전대부터 APT(Annotation Proccessing Tool)을 이용하면서 빌드시간에 미리 클래스들을 만들어주기때문에 속도향상에 도움이 됩니다.




Bind


 - Activity

super.setContentView(layoutResID);
ButterKnife.bind(this);



- Fragment


View view = LayoutInflater.from(getActivity()).inflate(resId, null);
ButterKnife.bind(this, view);


그 외에 adapter,holder에도 bind를 해줄수 있습니다.

단, Fragment의 경우는 효율적인 View리소스 관리를 위해 onDestoryView()에서 unbind해주는 작업을 해주는것이 좋습니다.






View객체 선언


View를 선언해주면서 @Bind를 이용해서 해당 View의 id를 할당해줍니다.

@BindView(R.id.view_action_sms)

View view_action_sms;
@BindView(R.id.view_action_comment)
View view_action_comment;
@BindView(R.id.view_input_comment)
View view_input_comment;
@BindView(R.id.et_comment)
CustomEditText et_comment;
@BindView(R.id.btn_comment_send)
SelphoneSendButton btn_comment_send;



어차피 View객체를 선언하는데 선언을 하면서 @BindView를 해주기만하면 번거로운 findViewById()의 사용을 줄일수 있습니다.







ClickListener추가


ClickListener가 필요한경우 setOnClickListener를 선언해줄필요 없이 바로 실행될 함수를 만들고 @OnClick 을 사용하면 됩니다.

만약 View가 button처럼 클릭 이벤트만을 받고싶은 경우라면 2번에서 처럼 View객체를 선언할 필요조차 없이 그냥 바로 @OnClick함수만 사용해도 됩니다.



@OnClick(R.id.view_action_call)
void onCallClick() {
....
}






여러 뷰에 대해서 하나의 함수만을 실행시키고 싶다면 아래와 같이 선언해주면 됩니다.


@OnClick({R.id.pager, R.id.indicator, R.id.cell_picture, R.id.cell_product, R.id.cell_price, R.id.cell_description,R.id.cell_location})
public void onSomeThingClick(View view) {

}






Resource Bind


xml에 만들어둔 resource값들도 바로 bind해서 가져올 수 있습니다.

아래 bind를 지원합니다.

@BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString



@BindString(R.string.title) String title;
@BindBool(R.bool.isTed) boolean isTed;
@BindInt(R.integer.myinteger) int myinteger;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red;
@BindDimen(R.dimen.spacer) Float spacer;
@BindDimen(R.dimen.intvalue) int intvalue;









Holder


개인적으로 Holder를 사용할때도 적용한다면 굉장히 유용했습니다.


public static class ViewHolder extends RecyclerView.ViewHolder {

@Bind(R.id.iv_image)
ImageView iv_image;

int position = -1;

public ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);

}

}







ButterKnife를 안써본 사람은 있어도, 한번 써보고 안쓰는사람은 없을것이라고 생각합니다.

그만큼 안드로이드 개발에서 View 변수 선언,연결,리스너를 연결하는 부분에서의 노가다(?)작업을 줄여주는 유용한 라이브러리라고 생각합니다.





혹시 안드로이드스튜디오가 아닌 이클립스 사용자시라면 별도의 설정이 필요합니다.

설정방법은 Butter Knife개발자가 작성해둔 이클립스 세팅방법을 보시고 설정하시면 됩니다.



4 Comments
댓글쓰기 폼