티스토리 뷰

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 콘텐츠 선언에 사용할 수 없습니다.
  • 양방향 데이터 결합을 지원하지 않습니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함