ডেটা বাইন্ডিং লাইব্রেরি বাইন্ডিং ক্লাস তৈরি করে যা আপনি লেআউটের ভেরিয়েবল ও ভিউ অ্যাক্সেস করতে ব্যবহার করতে পারবেন। এই ডকুমেন্টেশনে দেখানো হয়েছে কীভাবে জেনারেট করা বাইন্ডিং ক্লাস তৈরি ও কাস্টমাইজ করতে হয়।
জেনারেট করা বাইন্ডিং ক্লাস লেআউট ভেরিয়েবলকে লেআউটের মধ্যে থাকা ভিউয়ের সাথে লিঙ্ক করে। আপনি বাইন্ডিংয়ের নাম ও প্যাকেজ কাস্টমাইজ করতে পারবেন। জেনারেট করা সব বাইন্ডিং ক্লাস
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() পদ্ধতির একটি বিকল্প ভার্সন আছে যা
LayoutInflater অবজেক্ট ছাড়াও
ViewGroup অবজেক্ট নেয় , যেমন
নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
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);
আইডি সহ ভিউ
লেআউটে আইডি আছে এমন প্রতিটি ভিউয়ের জন্য ডেটা বাইন্ডিং লাইব্রেরি বাইন্ডিং ক্লাসে একটি অপরিবর্তনীয় ফিল্ড তৈরি করে। যেমন, ডেটা বাইন্ডিং লাইব্রেরি
নিম্নলিখিত লেআউট থেকে TextView ধরনের firstName এবং lastName ফিল্ড
তৈরি করে:
<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()
মেথড কল করার চেয়ে এই মেকানিজম দ্রুত হতে পারে।
ডেটা বাইন্ডিং ছাড়া আইডি যতটা প্রয়োজন, ডেটা বাইন্ডিং থাকলে ততটা প্রয়োজন হয় না, তবে এখনও এমন কিছু পরিস্থিতি আছে যেখানে কোড থেকে ভিউ অ্যাক্সেস করা প্রয়োজন।
ভেরিয়েবল
ডেটা বাইন্ডিং লাইব্রেরি লেআউটে ঘোষণা করা প্রতিটি ভেরিয়েবলের জন্য অ্যাক্সেসর পদ্ধতি
তৈরি করে। যেমন, নিম্নলিখিত লেআউট 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 ভিউ হায়ারার্কি থেকে অদৃশ্য হয়ে যায়, তাই বাইন্ডিং অবজেক্টের ভিউও অদৃশ্য হয়ে যেতে হবে যাতে এটি গার্বেজ কালেকশন দ্বারা দাবি করা যায়।
ভিউগুলি চূড়ান্ত হওয়ার কারণে, একটি
ViewStubProxy অবজেক্ট
জেনারেট করা বাইন্ডিং ক্লাসে ViewStub-এর স্থান নেয়, যা আপনাকে
ViewStub-এর অ্যাক্সেস দেয় যখন এটি বিদ্যমান থাকে এবং ViewStub ইনফ্লেট করা হলে ইনফ্লেটেড ভিউ
হায়ারার্কিতে অ্যাক্সেস দেয়।
অন্য লেআউট ইনফ্লেট করার সময়, নতুন লেআউটের জন্য বাইন্ডিং অবশ্যই তৈরি করতে হবে।
তাই, ViewStubProxy-কে অবশ্যই ViewStub শুনতে হবে
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.xml, ContactItemBinding ক্লাস জেনারেট করে। ক্লাসটি মডিউল প্যাকেজের অধীনে
একটি databinding প্যাকেজে রাখা হয়েছে। যেমন, মডিউল প্যাকেজ com.example.my.app হলে, বাইন্ডিং ক্লাস com.example.my.app.databinding প্যাকেজে রাখা হয়।
data এলিমেন্টের class অ্যাট্রিবিউট অ্যাডজাস্ট করে বাইন্ডিং ক্লাসের নাম পরিবর্তন করা বা অন্য প্যাকেজে রাখা যেতে পারে। যেমন, নিম্নলিখিত লেআউট
বর্তমান মডিউলের databinding প্যাকেজে ContactItem বাইন্ডিং ক্লাস
তৈরি করে:
<data class="ContactItem">
...
</data>
আপনি ক্লাস নামের আগে একটি পিরিয়ড যোগ করে অন্য প্যাকেজে বাইন্ডিং ক্লাস জেনারেট করতে পারবেন। নিম্নলিখিত উদাহরণটি মডিউল প্যাকেজে বাইন্ডিং ক্লাস তৈরি করে:
<data class=".ContactItem">
...
</data>
এছাড়াও, আপনি যেখানে বাইন্ডিং ক্লাস তৈরি করতে চান সেখানে সম্পূর্ণ প্যাকেজের নাম ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি com.example প্যাকেজে
ContactItem বাইন্ডিং ক্লাস তৈরি করে:
<data class="com.example.ContactItem">
...
</data>
অতিরিক্ত রিসোর্স
ডেটা বাইন্ডিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- লেআউট ও বাইন্ডিং এক্সপ্রেশন
- ডেটা বাইন্ডিং লাইব্রেরি
- বাইন্ডিং দেখুন