티스토리 뷰
findViewById
치느라 새끼손가락 아픈 횐님덜 viewBinding
의 세계로 오세욥 :D
사실은 뷰결합이 아니라 DataBinding
가지고 또 골머리를 싸매고 있었습니다만
생각보다 진도가 너무 안나가길래 뷰결합이라도 해보자 해서 시작했습니다.
이름은 비슷하잖아요
0. build.gradle에 viewBinding 요소 추가하기
뷰결합을 사용 설정하기 위해서 (앱수준)build.gradle에 다음을 추가해줍니다.
android {
...
viewBinding {
enabled = true
}
}
1. 사용하기
frag_search.xml
...
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_tit"
.../>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
...">
</androidx.recyclerview.widget.RecyclerView>
...
SearchFrag.java
Before
public class SearchFrag extends BaseFrag implements MyAdapter.MyListener {
...
TextView tv_tit;
RecyclerView rv;
...
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.frag_search, container, false);
View layout = binding.getRoot();
tv_tit = layout.findViewById(R.id.tv_tit);
rv = layout.findViewById(R.id.rv);
request();
return layout;
}
After
public class SearchFrag extends BaseFrag implements MyAdapter.MyListener {
...
//ViewBinding
private FragSearchBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragSearchBinding.inflate(inflater, container, false);
View layout = binding.getRoot();
request();
return layout;
}
💁♀️ 한눈에 봐도 굉장히 줄지 않았습니까? 사실 레이아웃에 TextView, Button 한두개 정도 있는 경우라면 그렇게 힘들지 않겠지만 버튼만 10개 있다고 상상해보세요. 끔찍합니다 :(
그리고 그동안 저는 그렇게 끔찍하게 살았지 뭐예요
FragSearchBinding
즉, 결합 인스턴스를 사용해 뷰를 참조하는 것입니다.
setText
또는 OnClickListener
같은 경우에도 이를 사용해서 뷰를 참조하게 됩니다.
ex) 사용예시
binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
viewModel.userClicked()
});
findViewById와 같은 반복 작업에서 개발자를 구해준 것 외에도 뷰결합은 다음과 같은 장점을 가집니다.
- Null 안전
- 뷰 결합은 뷰의 직접 참조를 생성하기 때문에 유효하지 않은 뷰 ID 로 인한 null 포인터 예외의 위험으로부터 안전합니다.
- 유형 안전
- 바인딩 클래스의 필드 유형들이 xml 파일이 참조하는 뷰와 일치하므로 클래스 변환 예외가 발생할 위험이 없습니다.
데이터결합과 비교했을 때에는 아래과 같은 차이점을 가집니다.
장점
- 빠른 컴파일
- 뷰 결합에 주석처리가 필요하지 않아 더 빨리 컴파일됩니다.
- 사용 편의성
- 데이터결합과 달리 xml 레이아웃에서 특별히 태그할 필요가 없습니다. build.gradle에서 (모듈에서) 사용 설정만 해주면 자동으로 적용되니까요
단점
- 레이아웃 변수 / 레이아웃 표현식을 지원하지 않습니다.
- xml 레이아웃에서 동적 UI 콘텐츠 선언에 사용할 수 없습니다.
- 양방향 데이터 결합을 지원하지 않습니다.
'ANDROID' 카테고리의 다른 글
RecyclerView 스크롤다운시 아이템 간격 벌어짐 현상 (0) | 2021.04.13 |
---|---|
Volley 에서 Retrofit2 로 통신 교체하기 (2) | 2021.04.04 |
null object reference 오류 (0) | 2021.03.25 |
OnClickListener에서 intent (0) | 2021.03.19 |
dependency추가해서 아이디/비밀번호 input 예쁘게! (0) | 2021.03.11 |
댓글