کتابخانه 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>
منابع اضافی
برای کسب اطلاعات بیشتر در مورد اتصال داده، به منابع اضافی زیر مراجعه کنید.
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- چیدمان ها و عبارات الزام آور
- کتابخانه صحافی داده
- مشاهده صحافی