উত্পন্ন বাঁধাই ক্লাস

ডেটা বাইন্ডিং লাইব্রেরি বাইন্ডিং ক্লাস তৈরি করে যা আপনি লেআউটের ভেরিয়েবল এবং ভিউ অ্যাক্সেস করতে ব্যবহার করতে পারেন। এই ডকুমেন্টেশন দেখায় কিভাবে জেনারেটেড বাইন্ডিং ক্লাস তৈরি এবং কাস্টমাইজ করা যায়।

জেনারেট করা বাইন্ডিং ক্লাস লেআউট ভেরিয়েবলকে লেআউটের ভিউয়ের সাথে লিঙ্ক করে। আপনি বাঁধাইয়ের নাম এবং প্যাকেজ কাস্টমাইজ করতে পারেন। সমস্ত উত্পন্ন বাঁধাই ক্লাস ViewDataBinding ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।

প্রতিটি লেআউট ফাইলের জন্য একটি বাইন্ডিং ক্লাস তৈরি করা হয়। ডিফল্টরূপে, ক্লাসের নাম হল প্যাস্কাল কেসে রূপান্তরিত লেআউট ফাইলের নাম যার সাথে বাইন্ডিং প্রত্যয় যোগ করা হয়েছে। সুতরাং, উদাহরণস্বরূপ, যদি লেআউট ফাইলের নাম হয় activity_main.xml , সংশ্লিষ্ট উৎপন্ন শ্রেণী হল ActivityMainBinding । এই ক্লাসটি লেআউট বৈশিষ্ট্য থেকে লেআউটের দৃষ্টিভঙ্গি পর্যন্ত সমস্ত বাইন্ডিং ধারণ করে এবং বাইন্ডিং এক্সপ্রেশনের জন্য কীভাবে মান নির্ধারণ করতে হয় তা জানে।

একটি বাঁধাই বস্তু তৈরি করুন

বাইন্ডিং অবজেক্টটি লেআউটটি স্ফীত করার সাথে সাথেই তৈরি করা হয় যাতে এটি লেআউটের মধ্যে অভিব্যক্তি সহ দৃষ্টিভঙ্গির সাথে আবদ্ধ হওয়ার আগে দৃশ্যের শ্রেণিবিন্যাস সংশোধন করা হয় না। একটি লেআউটে অবজেক্টকে আবদ্ধ করার সবচেয়ে সাধারণ পদ্ধতি হল বাইন্ডিং ক্লাসে স্ট্যাটিক পদ্ধতি ব্যবহার করা। আপনি ভিউ হায়ারার্কি স্ফীত করতে পারেন এবং বাইন্ডিং ক্লাসের inflate() পদ্ধতি ব্যবহার করে অবজেক্টটিকে আবদ্ধ করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

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 অবজেক্ট নেয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

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 ক্লাস ব্যবহার করে বাইন্ডিং তৈরি করতে পারেন, যেমনটি নিম্নলিখিত কোড স্নিপেটে প্রদর্শিত হয়েছে:

কোটলিন

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 ক্লাস ব্যবহার করতে পছন্দ করতে পারেন, যেমনটি নিম্নলিখিত কোড উদাহরণে দেখানো হয়েছে:

কোটলিন

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 আছে এমন প্রতিটি ভিউয়ের জন্য বাইন্ডিং ক্লাসে একটি অপরিবর্তনীয় ক্ষেত্র তৈরি করে। উদাহরণস্বরূপ, ডেটা বাইন্ডিং লাইব্রেরি নিম্নলিখিত লেআউট থেকে 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 বেস ক্লাস ফেরত দেয়।

কোটলিন

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>

অতিরিক্ত সম্পদ

ডেটা বাইন্ডিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন।

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}