반응형
오늘은 Jetpack의 DataBinding에 대해 알아보겠습니다.
1. DataBinding 이란?
Data 와 View(Xml)를 Binding(연결) 해서 코드를 쉽게 작성할 수 있도록 지원해주는 기능을 제공합니다.
2. DataBinding / ViewBinding 비교
- 공통점
- View를 직접 참조하는 데 사용할 수 있는 결합 클래스를 생성하며 관리합니다.
- 차이점
- 컴파일 속도 : ViewBinding > DataBinding
- Apk 용량 : ViewBinding < DataBinding
- ViewBinding은 단지 View 를 참조하여 사용해서 Controller 에서만 사용 가능합니다.
- DataBinding은 레이아웃 표현식을 지원해서 Xml 파일에서 직접 동적 UI 컨텐츠 선언이 가능합니다.
- DataBinding은 양방향 바인딩을 지원하지만, ViewBinding은 단방향 바인딩을 지원합니다.
- 결론
💡 DataBinding 과 ViewBinding 모두 사용하는 것이 가장 좋으며 ViewModel / 레이아웃 표현식 / 양방향 바인딩 등의 기능을 사용할 경우 DataBinding 사용, 단순 Xml Binding 만 필요할 경우에는 ViewBinding 사용이 적절합니다.
3. DataBinding / ViewBinding 사용법
- DataBinding 사용법
https://developer.android.com/topic/libraries/data-binding?hl=ko
- ViewBinding 사용법
https://developer.android.com/topic/libraries/view-binding?hl=ko
4. 경우에 따라 View 를 Binding 하는 방법
- DataBindingUtil 으로 선언하는 방법 (이 방법으로 통일 하겠습니다)
- xml 에 Layout 선언 후 자동 생성되는 ViewDataBinding 에 inflate 하는 방법 (ViewGroup 을 상속받는 CustomView 일경우 사용)
- Activity
DataBindingUtil 의 setContentView 사용
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}
- Fragment
DataBindingUtil 의 inflate 사용
// Fragment
FragmentMainBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
return binding.getRoot();
}
- Adapter
ViewHolder 를 사용 할 경우를 전제로 DataBindingUtil 의 inflate 사용
// Adapter
class MainAdapter extends RecyclerView.Adapter<MainViewHolder> {
private LayoutInflater layoutInflater;
@Override
public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType ) {
if( layoutInflater == null ) {
layoutInflater = LayoutInflater.from(parent.getContext());
}
MainItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.main_item, false);
return new MainViewHolder(binding);
}
}
// ViewHolder
class MainViewHolder extends RecyclerView.ViewHolder {
MainItemBinding binding;
public MainViewHolder(MainItemBinding binding) {
super(binding.getRoot() );
this.binding = binding;
}
}
- ViewGroup (CustomView 등)
CustomView 는 DataBindingUtil 을 사용하지 않음
public class CustomView extends LinearLayout{
CustomViewBinding binding;
public CustomView(Context context, AttributeSet inAttrs) {
super(context, inAttrs);
LayoutInflater inflater = LayoutInflater.from(inContext);
binding = CustomViewBinding.inflate(inflater, this, true);
}
...
}
- 기타 예외 사항
// View 가 null 이 아니고, 재사용 되는 경우
DataBindingUtil.getBinding(view);
// Binding Class 를 모를 경우
LayoutInflater inflater = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(inflater);
반응형