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 장점
- findViewByid를 사용할 필요가 없습니다.
- 레이아웃 내에서 정확한 view타입을 찾아 매핑하기 때문에 안전합니다.
- 레이아웃에 없는 id를 findviewById를 했을 때의 nullPointException을 방지합니다.
6. View Binding Layout 제외
<LinearLayout
...
tools:viewBindingIgnore="true">
...
</LinearLayout>
※ Layout의 최상위 뷰에 위의 코드를 추가하면 해당 Layout에 대한 바인딩 클래스가 생성되지 않습니다.
'Programming 개발은 구글로 > JAVA[Android]' 카테고리의 다른 글
[RxJava] Subject 클래스, ConnectableObservable (0) | 2022.12.01 |
---|---|
[Android] Activity 화면 켜짐 유지 및 해제 코드(Keep Screen On) (0) | 2022.11.30 |
[안드로이드] Glide 캐시 (0) | 2022.06.22 |
[안드로이드] 연속 3번 터치 시 다른 메뉴로 이동(hidden) (0) | 2022.06.21 |
[안드로이드] Glide Usage (0) | 2022.06.20 |
댓글