পর্যবেক্ষণযোগ্যতা বলতে একটি বস্তুর ডেটার পরিবর্তন সম্পর্কে অন্যদের অবহিত করার ক্ষমতা বোঝায়। ডেটা বাইন্ডিং লাইব্রেরি আপনাকে বস্তু, ক্ষেত্র বা সংগ্রহগুলিকে পর্যবেক্ষণযোগ্য করতে দেয়।
আপনি ডেটা বাইন্ডিং এর জন্য যেকোন অবজেক্ট ব্যবহার করতে পারেন, কিন্তু অবজেক্ট পরিবর্তন করার ফলে স্বয়ংক্রিয়ভাবে UI আপডেট হয় না। আপনি ডেটা বাইন্ডিং ব্যবহার করতে পারেন আপনার ডেটা অবজেক্টগুলিকে অন্য অবজেক্টগুলিকে জানানোর ক্ষমতা দিতে যা শ্রোতা হিসাবে পরিচিত - যখন তাদের ডেটা পরিবর্তিত হয়। তিনটি ধরণের পর্যবেক্ষণযোগ্য ক্লাস রয়েছে: ক্ষেত্র , সংগ্রহ এবং বস্তু ।
যখন এই পর্যবেক্ষণযোগ্য ডেটা অবজেক্টগুলির একটি UI এর সাথে আবদ্ধ থাকে এবং ডেটা অবজেক্টের একটি বৈশিষ্ট্য পরিবর্তন হয়, তখন UI স্বয়ংক্রিয়ভাবে আপডেট হয়।
পর্যবেক্ষণযোগ্য ক্ষেত্র
যদি আপনার ক্লাসে শুধুমাত্র কয়েকটি বৈশিষ্ট্য থাকে, তাহলে Observable
ইন্টারফেস বাস্তবায়ন করে এমন ক্লাস তৈরি করার প্রচেষ্টার মূল্য নাও হতে পারে। এই ক্ষেত্রে, আপনি ক্ষেত্রগুলিকে পর্যবেক্ষণযোগ্য করতে জেনেরিক Observable
ক্লাস এবং নিম্নলিখিত আদিম-নির্দিষ্ট ক্লাসগুলি ব্যবহার করতে পারেন:
-
ObservableBoolean
-
ObservableByte
-
ObservableChar
-
ObservableShort
-
ObservableInt
-
ObservableLong
-
ObservableFloat
-
ObservableDouble
-
ObservableParcelable
পর্যবেক্ষণযোগ্য ক্ষেত্রগুলি হল স্বয়ংসম্পূর্ণ পর্যবেক্ষণযোগ্য বস্তু যার একটি একক ক্ষেত্র রয়েছে। আদিম সংস্করণগুলি অ্যাক্সেস অপারেশনের সময় বক্সিং এবং আনবক্সিং এড়ায়। এই পদ্ধতিটি ব্যবহার করার জন্য, জাভা প্রোগ্রামিং ভাষায় একটি public final
সম্পত্তি তৈরি করুন বা কোটলিনে একটি পঠনযোগ্য সম্পত্তি তৈরি করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
class User { val firstName = ObservableField<String>() val lastName = ObservableField<String>() val age = ObservableInt() }
জাভা
private static class User { public final ObservableField<String> firstName = new ObservableField<>(); public final ObservableField<String> lastName = new ObservableField<>(); public final ObservableInt age = new ObservableInt(); }
ক্ষেত্রের মান অ্যাক্সেস করতে, set()
এবং get()
অ্যাক্সেসর পদ্ধতি ব্যবহার করুন বা Kotlin সম্পত্তি সিনট্যাক্স ব্যবহার করুন:
কোটলিন
user.firstName = "Google" val age = user.age
জাভা
user.firstName.set("Google"); int age = user.age.get();
পর্যবেক্ষণযোগ্য সংগ্রহ
কিছু অ্যাপ ডাটা ধারণ করতে ডায়নামিক স্ট্রাকচার ব্যবহার করে। পর্যবেক্ষণযোগ্য সংগ্রহগুলি একটি কী ব্যবহার করে এই কাঠামোগুলিতে অ্যাক্সেসের অনুমতি দেয়। ObservableArrayMap
ক্লাসটি উপযোগী যখন কী একটি রেফারেন্স টাইপ, যেমন String
, নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
ObservableArrayMap<String, Any>().apply { put("firstName", "Google") put("lastName", "Inc.") put("age", 17) }
জাভা
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); user.put("firstName", "Google"); user.put("lastName", "Inc."); user.put("age", 17);
লেআউটে, আপনি স্ট্রিং কী ব্যবহার করে মানচিত্রটি খুঁজে পেতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{String.valueOf(1 + (Integer)user.age)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ObservableArrayList
ক্লাসটি দরকারী যখন কীটি একটি পূর্ণসংখ্যা হয়, নিম্নরূপ:
কোটলিন
ObservableArrayList<Any>().apply { add("Google") add("Inc.") add(17) }
জাভা
ObservableArrayList<Object> user = new ObservableArrayList<>(); user.add("Google"); user.add("Inc."); user.add(17);
লেআউটে, আপনি সূচীগুলির মাধ্যমে তালিকাটি অ্যাক্সেস করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<data>
<import type="android.databinding.ObservableList"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
পর্যবেক্ষণযোগ্য বস্তু
Observable
ইন্টারফেস প্রয়োগ করে এমন একটি শ্রেণি শ্রোতাদের নিবন্ধনের অনুমতি দেয় যারা পর্যবেক্ষণযোগ্য বস্তু থেকে সম্পত্তির পরিবর্তন সম্পর্কে অবহিত হতে চায়।
Observable
ইন্টারফেসে শ্রোতাদের যোগ এবং অপসারণের একটি পদ্ধতি রয়েছে, তবে আপনি সিদ্ধান্ত নেন কখন বিজ্ঞপ্তি পাঠানো হবে। উন্নয়নকে সহজ করার জন্য, ডেটা বাইন্ডিং লাইব্রেরি BaseObservable
ক্লাস প্রদান করে, যা শ্রোতা নিবন্ধন পদ্ধতি প্রয়োগ করে। BaseObservable
প্রয়োগকারী ডেটা ক্লাস যখন বৈশিষ্ট্য পরিবর্তন হয় তখন বিজ্ঞপ্তি দেওয়ার জন্য দায়ী। এটি করার জন্য, গেটারকে একটি Bindable
টীকা বরাদ্দ করুন এবং সেটারে notifyPropertyChanged()
পদ্ধতিতে কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
class User : BaseObservable() { @get:Bindable var firstName: String = "" set(value) { field = value notifyPropertyChanged(BR.firstName) } @get:Bindable var lastName: String = "" set(value) { field = value notifyPropertyChanged(BR.lastName) } }
জাভা
private static class User extends BaseObservable { private String firstName; private String lastName; @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); } }
ডেটা বাইন্ডিং মডিউল প্যাকেজে BR
নামে একটি শ্রেণী তৈরি করে, যেখানে ডেটা বাইন্ডিংয়ের জন্য ব্যবহৃত সংস্থানগুলির আইডি রয়েছে। Bindable
টীকা সংকলনের সময় BR
ক্লাস ফাইলে একটি এন্ট্রি তৈরি করে। যদি ডেটা ক্লাসের জন্য বেস ক্লাস পরিবর্তন করা না যায়, তাহলে আপনি একটি PropertyChangeRegistry
অবজেক্ট ব্যবহার করে শ্রোতাদের দক্ষতার সাথে নিবন্ধন ও অবহিত করতে Observable
ইন্টারফেস প্রয়োগ করতে পারেন।
জীবনচক্র-সচেতন বস্তু
আপনার অ্যাপের লেআউটগুলি ডেটা বাইন্ডিং উত্সগুলির সাথেও আবদ্ধ হতে পারে যা স্বয়ংক্রিয়ভাবে UI কে ডেটার পরিবর্তন সম্পর্কে অবহিত করে৷ এইভাবে, আপনার বাইন্ডিংগুলি জীবনচক্র সম্পর্কে সচেতন এবং শুধুমাত্র তখনই ট্রিগার হয় যখন UI পর্দায় দৃশ্যমান হয়৷
ডেটা বাইন্ডিং StateFlow
এবং LiveData
সমর্থন করে। ডেটা বাইন্ডিং-এ LiveData
ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ডেটা পরিবর্তন সম্পর্কে UI-কে অবহিত করতে LiveData ব্যবহার করুন দেখুন।
স্টেটফ্লো ব্যবহার করুন
যদি আপনার অ্যাপ কোরটিনের সাথে কোটলিন ব্যবহার করে, তাহলে আপনি StateFlow
অবজেক্টগুলিকে ডেটা বাইন্ডিং সোর্স হিসেবে ব্যবহার করতে পারেন। আপনার বাইন্ডিং ক্লাসের সাথে একটি StateFlow
অবজেক্ট ব্যবহার করতে, StateFlow
অবজেক্টের সুযোগ নির্ধারণ করতে একটি লাইফসাইকেল মালিক নির্দিষ্ট করুন। নিম্নলিখিত উদাহরণটি বাইন্ডিং ক্লাস ইনস্ট্যান্ট হওয়ার পরে জীবনচক্রের মালিক হিসাবে কার্যকলাপটি নির্দিষ্ট করে:
class ViewModelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Inflate view and obtain an instance of the binding class.
val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)
// Specify the current activity as the lifecycle owner.
binding.lifecycleOwner = this
}
}
আর্কিটেকচার কম্পোনেন্টে লেআউট ভিউ বাইন্ডে বর্ণিত হিসাবে, ডেটা বাইন্ডিং ViewModel
অবজেক্টের সাথে নির্বিঘ্নে কাজ করে। আপনি নিম্নলিখিত হিসাবে StateFlow
এবং ViewModel
একসাথে ব্যবহার করতে পারেন:
class ScheduleViewModel : ViewModel() {
private val _username = MutableStateFlow<String>("")
val username: StateFlow<String> = _username
init {
viewModelScope.launch {
_username.value = Repository.loadUserName()
}
}
}
আপনার লেআউটে, আপনার ViewModel
অবজেক্টের বৈশিষ্ট্য এবং পদ্ধতিগুলিকে বাইন্ডিং এক্সপ্রেশন ব্যবহার করে সংশ্লিষ্ট দৃশ্যগুলিতে বরাদ্দ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<TextView
android:id="@+id/name"
android:text="@{viewmodel.username}" />
যখনই ব্যবহারকারীর নামের মান পরিবর্তন হয় তখনই UI স্বয়ংক্রিয়ভাবে আপডেট হয়।
স্টেটফ্লো সমর্থন অক্ষম করুন
কোটলিন এবং অ্যান্ড্রয়েডএক্স ব্যবহার করে এমন অ্যাপ্লিকেশানগুলির জন্য, StateFlow
সমর্থন স্বয়ংক্রিয়ভাবে ডেটা বাইন্ডিংয়ের সাথে অন্তর্ভুক্ত হয়৷ এর মানে হল যে নির্ভরতা ইতিমধ্যে উপলব্ধ না থাকলে কর্উটিন নির্ভরতা স্বয়ংক্রিয়ভাবে আপনার অ্যাপে অন্তর্ভুক্ত করা হয়।
আপনি আপনার build.gradle
ফাইলে নিম্নলিখিত যোগ করে এই কার্যকারিতা থেকে অপ্ট আউট করতে পারেন:
গ্রোভি
android { ... dataBinding { addKtx = false } }
কোটলিন
android { ... dataBinding { addKtx = false } }
বিকল্পভাবে, আপনি gradle.properties
ফাইলে নিম্নলিখিত লাইন যোগ করে আপনার প্রকল্পে বিশ্বব্যাপী StateFlow
অক্ষম করতে পারেন:
গ্রোভি
android.defaults.databinding.addKtx = false
কোটলিন
android.defaults.databinding.addKtx = false
অতিরিক্ত সম্পদ
ডেটা বাইন্ডিং সম্পর্কে আরও জানতে, অতিরিক্ত সংস্থানগুলির জন্য নিম্নলিখিতগুলি দেখুন:
নমুনা
কোডল্যাব
ব্লগ পোস্ট
{% শব্দার্থে %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- ViewModel-এর জন্য সংরক্ষিত স্টেট মডিউল
- আর্কিটেকচার উপাদানে বিন্যাস দৃশ্য আবদ্ধ করুন
- পেজিং লাইব্রেরি ওভারভিউ