کلاس های الزام آور ایجاد شده است

کتابخانه Data Binding کلاس های اتصالی را تولید می کند که می توانید از آنها برای دسترسی به متغیرها و نماهای طرح بندی استفاده کنید. این مستندات نحوه ایجاد و سفارشی سازی کلاس های اتصال تولید شده را نشان می دهد.

کلاس اتصال ایجاد شده، متغیرهای طرح بندی را با نماهای درون طرح پیوند می دهد. می توانید نام و بسته صحافی را سفارشی کنید . تمام کلاس‌های binding تولید شده از کلاس ViewDataBinding به ارث می‌برند.

یک کلاس binding برای هر فایل layout تولید می شود. به طور پیش فرض، نام کلاس، نام فایل layout است که به حروف پاسکال تبدیل شده و پسوند Binding به آن اضافه شده است. بنابراین، برای مثال، اگر نام فایل طرح‌بندی، activity_main.xml باشد، کلاس تولید شده مربوطه ActivityMainBinding است. این کلاس همه اتصالات از خصوصیات layout تا view های layout را نگه می دارد و می داند که چگونه برای عبارات binding مقادیر اختصاص دهد.

یک شیء اتصال ایجاد کنید

شی binding بلافاصله پس از باد کردن طرح‌بندی ایجاد می‌شود تا مطمئن شود سلسله‌مراتب view قبل از اینکه به نماها با عبارات درون طرح متصل شود، اصلاح نشده باشد. متداول ترین روش برای اتصال شی به یک layout استفاده از متدهای static در کلاس binding است. همانطور که در مثال زیر نشان داده شده است، می توانید سلسله مراتب view را با استفاده از متد inflate() کلاس binding افزایش دهید و شی را به آن متصل کنید:

کاتلین

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 می گیرد، همانطور که در مثال زیر نشان داده شده است:

کاتلین

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

جاوا

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

اگر طرح با استفاده از مکانیزم متفاوت باد شده است، می توانید آن را به صورت جداگانه به صورت زیر ببندید:

کاتلین

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

جاوا

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

گاهی اوقات نوع صحافی را از قبل نمی دانید. در چنین مواردی، همانطور که در قطعه کد زیر نشان داده شده است، می توانید با استفاده از کلاس DataBindingUtil ، binding را ایجاد کنید:

کاتلین

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() کلاس‌های bindings یا کلاس DataBindingUtil استفاده کنید، همانطور که در مثال کد زیر نشان داده شده است:

کاتلین

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);

نماها با شناسه

کتابخانه Data Binding یک فیلد تغییرناپذیر در کلاس binding برای هر نما که یک شناسه در طرح دارد ایجاد می کند. برای مثال، Data Binding Library فیلدهای firstName و lastName از نوع TextView از طرح زیر ایجاد می کند:

<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>

این کتابخانه نماها، از جمله شناسه‌ها را از سلسله مراتب مشاهده در یک پاس استخراج می‌کند. این مکانیسم می تواند سریعتر از فراخوانی متد findViewById() برای هر view در طرح بندی باشد.

شناسه ها آنقدرها که بدون اتصال داده ها ضروری هستند ضروری نیستند، اما هنوز هم مواردی وجود دارد که دسترسی به نماها از طریق کد ضروری است.

متغیرها

کتابخانه Data Binding متدهای دسترسی را برای هر متغیری که در طرح‌بندی اعلام شده است تولید می‌کند. به عنوان مثال، طرح زیر متدهای setter و getter را در کلاس binding برای متغیرهای 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>

ViewStubs

برخلاف نماهای معمولی، اشیاء ViewStub به صورت نماهای نامرئی شروع می شوند. هنگامی که آنها قابل مشاهده هستند یا به صراحت باد می شوند، با باد کردن یک طرح دیگر، خود را در طرح جایگزین می کنند.

از آنجایی که ViewStub از سلسله مراتب view ناپدید می شود، نمای موجود در شی binding نیز باید ناپدید شود تا بتوان آن را توسط جمع آوری زباله ادعا کرد. از آنجایی که نماها نهایی هستند، یک شی ViewStubProxy جای ViewStub را در کلاس binding تولید شده می گیرد و به شما امکان دسترسی به ViewStub در صورت وجود و دسترسی به سلسله مراتب نمای باد شده زمانی که ViewStub باد می شود را می دهد.

هنگام باد کردن یک طرح دیگر، باید برای طرح جدید یک اتصال ایجاد شود. بنابراین، ViewStubProxy باید به ViewStub OnInflateListener گوش دهد و در صورت لزوم، اتصال را برقرار کند. از آنجایی که فقط یک شنونده می تواند در یک زمان وجود داشته باشد، ViewStubProxy به شما امکان می دهد یک OnInflateListener را تنظیم کنید، که پس از برقراری اتصال فراخوانی می کند.

صحافی فوری

هنگامی که یک متغیر یا شیء قابل مشاهده تغییر می کند، اتصال قبل از فریم بعدی تغییر می کند. با این حال، مواقعی وجود دارد که اتصال باید فوراً اجرا شود. برای اجرای اجباری، از متد executePendingBindings() استفاده کنید.

متغیرهای پویا

گاهی اوقات، کلاس اتصال خاص ناشناخته است. برای مثال، یک RecyclerView.Adapter که در برابر طرح‌بندی‌های دلخواه عمل می‌کند، کلاس اتصال خاصی را نمی‌شناسد. باید مقدار binding را در طول فراخوانی به متد onBindViewHolder() اختصاص دهد.

در مثال زیر، تمام طرح‌بندی‌هایی که RecyclerView به آن‌ها متصل می‌شود دارای یک متغیر item هستند. شی BindingHolder دارای یک متد getBinding() است که کلاس پایه ViewDataBinding را برمی گرداند.

کاتلین

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 بر اساس نام فایل طرح‌بندی تولید می‌شود که با یک حرف بزرگ شروع می‌شود، زیرخط (_) حذف می‌شود، حرف زیر بزرگ می‌شود و کلمه Binding پسوند می‌شود. برای مثال، فایل layout contact_item.xml کلاس ContactItemBinding را تولید می کند. کلاس در یک بسته databinding در زیر بسته ماژول قرار می گیرد. به عنوان مثال، اگر بسته ماژول com.example.my.app باشد، کلاس binding در بسته com.example.my.app.databinding قرار می گیرد.

کلاس های Binding را می توان با تنظیم ویژگی class عنصر data تغییر نام داد یا در بسته های مختلف قرار داد. به عنوان مثال، طرح زیر کلاس اتصال ContactItem را در بسته databinding در ماژول فعلی ایجاد می کند:

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

شما می توانید کلاس binding را در یک بسته متفاوت با پیشوند نام کلاس با نقطه ایجاد کنید. مثال زیر کلاس binding را در بسته ماژول تولید می کند:

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

همچنین می توانید از نام کامل بسته در جایی که می خواهید کلاس binding تولید شود استفاده کنید. مثال زیر کلاس اتصال ContactItem را در بسته com.example ایجاد می کند:

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

منابع اضافی

برای کسب اطلاعات بیشتر در مورد اتصال داده، به منابع اضافی زیر مراجعه کنید.

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}