본문 바로가기
Programming 개발은 구글로/JAVA[Android]

[안드로이드] View Binding

by 40대직장인 2022. 6. 25.

View Binding

 

현재 진행중인 App 개발에서는 ButterKnife.bind로 처리를 하고 있으나 ButterKnife 개발자가 공식적으로 deprecated를 선언하고 구글에서 권고하는 View Binding을 사용하기 위해 정리하였습니다.

1. build.gradle 수정

android {
	...
        buildFeatures {
        viewBinding = true
    }
}
 

build.gradle에서 뷰 바인딩을 설정하면 안드로이드 스튜디오에서 자동으로 xml 파일과 연동되는 바인딩 클래스가 생성이 됩니다.

※ 뷰 바인딩 클래스 이름은 연동되어 있는 해당 Activity의 이름을 반전시킨 이름으로 생성이 됩니다.

ex) MainActivity 클래스 → ActivityMainBinding

 

2. 뷰 바인딩 사용하기

모듈에 뷰 바인딩을 사용하면 각 xml 레이아웃 파일에 대해 바인딩 클래스가 생성되고 각 바인딩 클래스에는 RootView와 ID가 있는 모든 뷰에 대한 참조를 포함하고 있습니다.

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/name" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:cropToPadding="true" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button"/>
    </LinearLayout>

※ Layout의 TextView와 Button은 ID를 가지고 있지만, 레이아웃의 ImageView에는 ID가 없으므로 바인딩 클래스에 대한 참조가 없습니다.

 

3. 객체 초기화 및 setContentView

private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater()); // Use inflate() 인스턴스 생성 
        View view = binding.getRoot(); // Layout 최상위 view
        setContentView(view);
    }

 

 4. xml 파일의 view component와 연결

    binding.textView1.setText("텍스트뷰1"); // binding.id로 뷰를 참조
    binding.textView2.setText("텍스트뷰1");
    binding.button.setOnClickListener(view -> {
        click();
    });

 

5. View Binding 장점

  1. findViewByid를 사용할 필요가 없습니다.
  2. 레이아웃 내에서 정확한 view타입을 찾아 매핑하기 때문에 안전합니다.
  3. 레이아웃에 없는 id를 findviewById를 했을 때의 nullPointException을 방지합니다.

6. View Binding Layout 제외

<LinearLayout
         ...
         tools:viewBindingIgnore="true">
    ...
</LinearLayout>
※ Layout의 최상위 뷰에 위의 코드를 추가하면 해당 Layout에 대한 바인딩 클래스가 생성되지 않습니다.

 

 

 

댓글