*개인적으로 분석한 내용이므로 틀린 내용이 있을 수 있습니다. 틀린 내용을 댓글로 남겨주시면 수정하도록 하겠습니다!
[1]. ViewBinding 활성화
1. ViewBinding 을 활성화하면 Binding class 가 자동으로 생성되며, findViewById 를 사용하지 않고 Activity 또는 Fragment 에서 View 에 접근할 수 있다.
android {
...
//ViewBinding 활성화
buildFeatures {
viewBinding true
}
}
[2]. Binding class 분석
1. Activity 또는 Fragment 에서 binding 객체를 생성하기 위해 Binding class 의 inflate 메서드를 호출하면 Binding class 에 연결된 xml 파일의 View 계층을 inflate 한다
//View 에 접근하기 위해 binding 객체를 생성할 때 호출하는 진입 메서드
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
//activity_main.xml 에 정의된 View 계층을 inflate 한다
View root = inflater.inflate(R.layout.activity_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
2. xml 을 inflate 한 후 ViewBindings 클래스의 findChildViewById 메서드를 호출하여 View 의 id 를 통해 View 객체를 가져온다.
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
//R.id.after_login_group 이라는 id 를 통해 Group 객체를 가져온다
id = R.id.after_login_group;
Group afterLoginGroup = ViewBindings.findChildViewById(rootView, id);
if (afterLoginGroup == null) {
break missingId;
}
...
return new ActivityMainBinding((ConstraintLayout) rootView, afterLoginGroup,
afterLoginTextView, beforeLoginGroup, emailEditText, loginButton, passwordEditText);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
3. 자식 View 객체를 모두 정상적으로 가져온 경우 Binding class 의 객체를 생성하여 반환한다. 이때 bind 메서드에서 가져온 View 객체들을 통해 필드를 초기화한다.
private ActivityMainBinding(@NonNull ConstraintLayout rootView, @NonNull Group afterLoginGroup,
@NonNull TextView afterLoginTextView, @NonNull Group beforeLoginGroup,
@NonNull EditText emailEditText, @NonNull AppCompatButton loginButton,
@NonNull EditText passwordEditText) {
this.rootView = rootView;
this.afterLoginGroup = afterLoginGroup;
this.afterLoginTextView = afterLoginTextView;
this.beforeLoginGroup = beforeLoginGroup;
this.emailEditText = emailEditText;
this.loginButton = loginButton;
this.passwordEditText = passwordEditText;
}
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
...
return new ActivityMainBinding((ConstraintLayout) rootView, afterLoginGroup,
afterLoginTextView, beforeLoginGroup, emailEditText, loginButton, passwordEditText);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
[3]. 요약
gradle 파일에서 ViewBinding 을 활성화하면 Binding class 가 자동으로 생성되며 Activity 또는 Fragment 에서 생성된 Binding 클래스의 inflate 메서드를 호출하면 xml inflate → View 객체 획득 → View 객체를 통해 Binding class 필드 초기화 → Binding class 의 객체 반환 순서로 동작하여 Activity 또는 Fragment 에서 findViewById 를 사용하지 않고 Binding class 의 객체를 통해 View 에 바로 접근하여 사용할 수 있다.
'android > Jetpack' 카테고리의 다른 글
| 5-1. Jetpack Navigation의 구성요소 (0) | 2022.10.09 |
|---|---|
| 4-2 단방향 데이터 바인딩, 양방향 데이터 바인딩 (0) | 2022.10.08 |
| 4-1 DataBinding (1) | 2022.10.07 |
| 3. LiveData (0) | 2022.10.03 |
| 2. ViewModel 과 ViewModelFactory (0) | 2022.10.02 |