뷰 결합 Android Jetpack의 구성요소

뷰 결합은 상호작용하는 코드를 더 쉽게 작성할 수 있는 기능입니다. 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈의 바인딩을 생성함 클래스를 지정해야 합니다. 결합의 인스턴스 클래스는 표시됩니다.

대부분의 경우 뷰 결합이 findViewById를 대체합니다.

설정

뷰 결합은 모듈별로 사용 설정됩니다. 다음에서 뷰 결합을 사용 설정하려면 다음 안내를 따르세요. 모듈의 경우 모듈 수준에서 viewBinding 빌드 옵션을 true로 설정합니다. build.gradle 파일을 엽니다.

Groovy

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

Kotlin

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

결합 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 해당 레이아웃의 루트 뷰에 tools:viewBindingIgnore="true" 속성을 추가합니다. 파일:

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

사용

모듈에 뷰 결합이 사용 설정되면 모듈마다 결합 클래스가 생성됩니다. 모듈에 포함된 XML 레이아웃 파일입니다. 각 결합 클래스에 참조가 포함됨 루트 뷰와 ID가 있는 모든 뷰에 적용할 수 있습니다. 결합 클래스의 이름은 다음과 같습니다. XML 파일의 이름을 파스칼 표기법으로 변환하고 단어 "바인딩" 있습니다.

예를 들어 다음과 같은 레이아웃 파일 result_profile.xml이 있다고 가정해 보겠습니다. 다음과 같습니다.

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

생성된 결합 클래스 이름은 ResultProfileBinding이 됩니다. 이 클래스에는 필드: name라는 TextViewbutton라는 Button입니다. 이 레이아웃의 ImageView에는 ID가 없으므로 바인딩 클래스도 지원합니다.

모든 결합 클래스에는 getRoot() 메서드를 포함하여 참조해야 합니다. 이 예에서 ResultProfileBinding 클래스의 getRoot() 메서드는 다음을 반환합니다. LinearLayout 루트 뷰

다음 섹션에서는 생성된 바인딩 클래스를 사용하는 방법을 보여줍니다. 사용할 수 있습니다.

활동에서 뷰 결합 사용

활동에 사용할 결합 클래스의 인스턴스를 설정하려면 다음을 수행합니다. 액티비티의 onCreate() 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다.

  1. 생성된 결합 클래스에 포함된 정적 inflate() 메서드를 호출합니다. 그러면 활동에서 사용할 결합 클래스 인스턴스가 생성됩니다.
  2. getRoot() 메서드를 호출하여 루트 뷰 참조를 가져옵니다. 사용하여 Kotlin 속성 구문을 참고하세요.
  3. 루트 뷰를 setContentView() 드림 화면에 Active View가 표시됩니다.

이러한 단계는 다음 예에 나와 있습니다.

Kotlin

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

자바

private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

이제 결합 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

자바

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

프래그먼트에서 뷰 결합 사용

프래그먼트에 사용할 결합 클래스의 인스턴스를 설정하려면 다음을 수행합니다. 프래그먼트의 onCreateView() 드림 메서드를 사용하여 축소하도록 요청합니다.

  1. 생성된 결합 클래스에 포함된 정적 inflate() 메서드를 호출합니다. 그러면 프래그먼트에서 사용할 결합 클래스 인스턴스가 생성됩니다.
  2. getRoot() 메서드를 호출하여 루트 뷰 참조를 가져옵니다. 사용하여 Kotlin 속성 구문을 참고하세요.
  3. onCreateView() 메서드에서 루트 뷰를 반환하여 Active View를 볼 수 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.

Kotlin

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

자바

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

이제 결합 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

자바

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

다양한 구성에 관한 힌트 제공

여러 구성에서 뷰를 선언할 때 가끔 특정 레이아웃에 따라 다른 뷰 유형을 사용하는 것이 좋습니다. 다음 코드 스니펫에서 이러한 예를 보여줍니다.

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" />

이 경우 생성된 클래스가 userBio 필드를 노출한다고 예상할 수 있습니다. TextView가 공통 기본 클래스이기 때문에 TextView 유형입니다. 원인 기술적 제한이 있으면 뷰 결합 코드 생성기가 이를 확인할 수 없고 대신 View 필드를 생성합니다. 이를 위해서는 나중에 binding.userBio as TextView

이 제한을 해결하기 위해 뷰 결합은 tools:viewBindingType를 지원합니다. 속성을 사용하여 생성된 코드에서 사용할 유형을 컴파일러에 알려줄 수 있습니다. 이전 예에서는 이 속성을 사용하여 컴파일러가 필드를 TextView로 생성합니다.

# in res/layout/example.xml (unchanged)

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

또 다른 예제에서 두 개의 레이아웃이 있다고 가정해 보겠습니다. 하나는 BottomNavigationViewNavigationRailView가 포함된 다른 호출 모두 클래스는 대부분의 구현을 포함하는 NavigationBarView를 확장합니다. 확인하세요. 코드가 클래스에 어떤 서브클래스가 있는지 정확히 알 필요가 없는 경우 tools:viewBindingType를 사용하여 생성된 두 레이아웃에서 모두 NavigationBarView로 입력합니다.

# in res/layout/navigation_example.xml

<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

# in res/layout-w720/navigation_example.xml

<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

코드를 생성할 때는 뷰 결합에서 이 속성 값의 유효성을 검사할 수 없습니다. 받는사람 컴파일 시간 및 런타임 오류를 방지하려면 값이 다음을 충족해야 합니다. 조건:

  • 값은 android.view.View에서 상속된 클래스여야 합니다.
  • 값은 값이 배치되는 태그의 슈퍼클래스여야 합니다. 예를 들어 다음 값은 작동하지 않습니다.

      <TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. -->
      <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
    
  • 최종 유형은 모든 구성에서 일관되게 확인되어야 합니다.

findViewById와의 차이점

뷰 결합에는 findViewById를 사용하는 것에 비해 다음과 같은 중요한 장점이 있습니다.

  • Null 안전: 뷰 결합이 뷰를 직접 참조하므로 잘못된 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없습니다. 또한 뷰가 레이아웃에서 결합 클래스에 참조를 포함하는 필드가 표시됨 @Nullable를 사용합니다.
  • 유형 안전성: 각 결합 클래스의 필드의 유형이 참조되는 뷰입니다. 즉, 클래스 자체를 실행할 위험이 없고 변환 예외가 발생합니다.

이러한 차이는 레이아웃과 코드 간의 비호환성을 의미합니다. 런타임이 아닌 컴파일 시간에 빌드가 실패합니다.

데이터 결합과 비교

뷰 결합과 데이터 결합은 모두 뷰를 직접 참조하는 데 사용할 수 있는 결합 클래스 그러나 바인딩은 더 간단한 사용 사례를 처리하기 위한 것이며 다음을 제공합니다. 다음과 같은 이점이 있습니다.

  • 더 빠른 컴파일: 뷰 결합에는 주석 처리가 필요하지 않으므로 컴파일 시간이 빨라집니다
  • 사용 편의성: 뷰 결합에는 특별히 태그가 지정된 XML 레이아웃이 필요하지 않습니다. 더 빠르게 채택할 수 있습니다. 다음에서 뷰 결합을 사용 설정하면 해당 모듈의 모든 레이아웃에 자동으로 적용됩니다.

반면에 뷰 결합에는 데이터에 비해 다음과 같은 제한사항이 있습니다. 바인딩:

따라서 경우에 따라서는 두 가지 보기를 모두 사용하는 것이 가장 좋습니다. 데이터 결합입니다. 다음과 같은 레이아웃에서 데이터 결합을 사용할 수 있습니다. 고급 기능이 필요하며, 필요하지 않은 레이아웃에서는 뷰 결합을 사용해야 합니다.

추가 리소스

뷰 결합에 관한 자세한 내용은 다음 추가 리소스를 참고하세요.

샘플

블로그

동영상