본문 바로가기

android/Jetpack

1. ViewBinding

*개인적으로 분석한 내용이므로 틀린 내용이 있을 수 있습니다. 틀린 내용을 댓글로 남겨주시면 수정하도록 하겠습니다!

 

[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 inflateView 객체 획득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