생성된 바인딩 클래스

데이터 결합 라이브러리는 사용할 수 있습니다. 이 문서에서는 바인딩 클래스를 맞춤설정합니다.

생성된 결합 클래스는 레이아웃 변수를 있습니다. 애플리케이션의 이름과 패키지를 맞춤설정할 수 있습니다. 지정합니다. 생성된 모든 결합 클래스는 ViewDataBinding 클래스

각 레이아웃 파일의 결합 클래스가 생성됩니다. 기본적으로 클래스는 Binding을 사용하여 파스칼 표기법으로 변환된 레이아웃 파일의 이름입니다. 추가할 수 있습니다. 예를 들어 레이아웃 파일 이름이 activity_main.xml: 이에 상응하는 생성된 클래스는 ActivityMainBinding입니다. 이 클래스는 레이아웃 속성에서 레이아웃의 결합 표현식의 값을 할당하는 방법을 알고 있습니다.

결합 개체 만들기

레이아웃을 확장한 직후 결합 객체가 생성되어 뷰 계층 구조가 수정되어 표현식도 제공됩니다. 객체를 결합 클래스에서 정적 메서드를 사용하는 것입니다. 포드를 확장하기 위해 뷰 계층 구조에서 inflate() 메서드를 사용하여 객체를 이 뷰에 바인딩합니다. 바인딩 클래스를 제공합니다.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

자바

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());

    setContentView(binding.root);
}

다음을 사용하는 inflate() 메서드의 대체 버전이 있습니다. ViewGroup 객체 LayoutInflater 객체를 다음 예에 나와 있습니다.

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

자바

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

다른 메커니즘을 사용하여 레이아웃이 확장되는 경우 이를 바인딩할 수 있습니다. 방법은 다음과 같습니다.

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

자바

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

결합 유형을 미리 알 수 없는 경우도 있습니다. 이러한 경우 다음 명령어를 사용하여 바인딩을 만듭니다. DataBindingUtil 클래스 아래 코드 스니펫에서와 같습니다.

Kotlin

val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

자바

View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(viewRoot);

클래스 내에서 데이터 결합 항목을 사용하는 경우 Fragment님, ListView 또는 RecyclerView 이 경우 네트워크 연결 시에는 inflate() 결합 클래스의 메서드 또는 DataBindingUtil 클래스에 다음 코드 예를 참고하세요.

Kotlin

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

자바

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

ID가 있는 뷰

데이터 결합 라이브러리는 레이아웃에 ID가 있는 각 뷰를 반환합니다. 예를 들어 데이터 결합 라이브러리는 이 코드는 다음에서 TextView 유형의 firstNamelastName 필드를 만듭니다. 다음 레이아웃:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

라이브러리는 기본 뷰의 뷰 계층 구조에서 ID를 포함한 뷰를 추출합니다. 사용할 수 있습니다 이 메커니즘은 findViewById() 드림 메서드를 호출합니다.

ID는 데이터 결합이 없을 때만큼 필요하지는 않지만 여전히 코드에서 뷰에 액세스해야 하는 일부 인스턴스

변수

데이터 결합 라이브러리는 선언된 각 변수의 접근자 메서드를 생성합니다. 있습니다. 예를 들어 다음 레이아웃은 setter와 getter를 생성합니다. user, image, note 변수의 결합 클래스에서 다음과 같은 메서드를 호출합니다.

<data>
   <import type="android.graphics.drawable.Drawable"/>
   <variable name="user" type="com.example.User"/>
   <variable name="image" type="Drawable"/>
   <variable name="note" type="String"/>
</data>

ViewStub

일반 뷰와 달리 ViewStub 객체는 보이지 않는 뷰로 시작합니다. 광고가 표시되거나 명시적으로 확장되면 다른 레이아웃을 확장하여 레이아웃에서 자신을 대체합니다.

ViewStub가 뷰 계층 구조에서 사라지기 때문에 가비지 컬렉션에서 결합 객체를 사용하도록 하려면 결합 객체도 사라져야 합니다. 조회는 최종적이므로 ViewStubProxy 객체 생성된 바인딩 클래스에서 ViewStub 대신 ViewStub가 있는 경우 이에 대한 액세스 및 확장된 뷰 액세스 확장될 때 ViewStub 계층 구조로 구성되어야 합니다.

다른 레이아웃을 확장할 때는 새 레이아웃의 결합을 설정해야 합니다. 따라서 ViewStubProxyViewStub를 수신 대기해야 합니다. OnInflateListener 필요한 경우 바인딩을 설정합니다 하나의 리스너만 존재할 수 있으므로 ViewStubProxy를 사용하면 OnInflateListener를 설정할 수 있습니다. 알 수 있습니다.

즉시 바인딩

변수 또는 관찰 가능한 객체가 변경되면 결합이 변경되도록 예약됩니다. 확인할 수 있습니다. 하지만 바인딩을 실행해야 할 때가 있습니다. 즉시 삭제할 수 있습니다 강제로 실행하려면 executePendingBindings() 드림 메서드를 사용하여 축소하도록 요청합니다.

동적 변수

특정 결합 클래스를 알 수 없는 경우도 있습니다. 예를 들어 RecyclerView.Adapter 드림 임의의 레이아웃에 대해 작동하는 기능은 특정 결합 클래스를 모릅니다. 그것은 가 onBindViewHolder() 드림 메서드를 사용하여 축소하도록 요청합니다.

다음 예에서는 RecyclerView가 바인딩되는 모든 레이아웃에 item 변수 BindingHolder 객체에는 getBinding() 메서드가 있습니다. 반환 값: 기본 ViewDataBinding 클래스에 대해 자세히 알아보세요.

Kotlin

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
    item: T = items.get(position)
    holder.binding.setVariable(BR.item, item);
    holder.binding.executePendingBindings();
}

자바

public void onBindViewHolder(BindingHolder holder, int position) {
    final T item = items.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
}

백그라운드 스레드

데이터 모델이 백그라운드 스레드에서 실행되지 않는 한 컬렉션입니다. 데이터 결합은 평가 중에 각 변수 또는 필드를 다음과 같이 현지화합니다. 동시 실행 문제를 방지할 수 있습니다

맞춤 결합 클래스 이름

기본적으로 결합 클래스는 레이아웃 파일의 이름을 기반으로 생성됩니다. 대문자로 시작하고 밑줄 ( _ )을 삭제하고 Binding이라는 단어를 접미사로 추가하는 것이 좋습니다. 예를 들어 레이아웃 파일은 contact_item.xmlContactItemBinding 클래스를 생성합니다. 클래스는 모듈 패키지의 databinding 패키지에서 찾을 수 있습니다. 예를 들어 모듈이 패키지가 com.example.my.app인 경우 결합 클래스는 com.example.my.app.databinding 패키지.

바인딩 클래스의 이름을 변경하거나 바인딩 클래스를 조정하여 바인딩 클래스를 다른 패키지에 배치할 수도 있습니다. data 요소의 class 속성입니다. 예를 들어 다음 레이아웃은 다음 디렉터리의 databinding 패키지에 ContactItem 결합 클래스를 생성합니다. 최신 모듈:

<data class="ContactItem">
    ...
</data>

클래스 접두어를 추가하여 다른 패키지에서 결합 클래스를 생성할 수 있습니다. 이름을 입력합니다. 다음 예에서는 모듈 패키지:

<data class=".ContactItem">
    ...
</data>

결합 클래스를 배치하려는 위치의 전체 패키지 이름을 사용할 수도 있습니다. 생성됩니다. 다음 예에서는 다음 위치에 ContactItem 결합 클래스를 만듭니다. com.example 패키지:

<data class="com.example.ContactItem">
    ...
</data>

추가 리소스

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