डेटा बाइंडिंग लाइब्रेरी बाइंडिंग क्लास जनरेट करती है. इनका इस्तेमाल के वैरिएबल और व्यू शामिल हैं. इस दस्तावेज़ में बताया गया है कि जनरेट की गई बाइंडिंग क्लास को पसंद के मुताबिक बनाने के लिए किया जा सकता है.
जनरेट की गई बाइंडिंग क्लास, लेआउट वैरिएबल को
लेआउट. आप इसके नाम और पैकेज को कस्टमाइज़ कर सकते हैं
बाइंडिंग. जनरेट की गई सभी बाइंडिंग क्लास
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) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.root); }
inflate()
तरीके का एक वैकल्पिक वर्शन है, जो
ViewGroup
ऑब्जेक्ट
LayoutInflater
ऑब्जेक्ट , जैसा
नीचे दिए गए उदाहरण में दिखाया गया है:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
अगर लेआउट को किसी अलग तरीके का इस्तेमाल करके इनफ़्लेट किया गया है, तो उसे बाइंड किया जा सकता है अलग से दिखेगा, जिसकी जानकारी यहां दी गई है:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
कभी-कभी आपको पहले से पता नहीं होता कि बाइंडिंग टाइप क्या है. ऐसे मामलों में, आपको
इसका इस्तेमाल करके बाइंडिंग बनाएं
DataBindingUtil
क्लास,
जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:
Kotlin
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Java
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)
Java
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>
व्यूस्टब
सामान्य व्यू से अलग, 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(); }
Java
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>
यहां उस पूरे पैकेज नाम का भी इस्तेमाल किया जा सकता है जहां बाइंडिंग क्लास को रखना है
जनरेट किया गया. नीचे दिए गए उदाहरण में, ContactItem
बाइंडिंग क्लास बनाई गई है
com.example
पैकेज:
<data class="com.example.ContactItem">
...
</data>
अन्य संसाधन
डेटा बाइंडिंग के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अतिरिक्त संसाधन देखें.
- Android डेटा बाइंडिंग लाइब्रेरी के सैंपल
- Android में डेटा बाइंडिंग
- डेटा बाइंडिंग — आपने बहुत कुछ सीखा
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- लेआउट और बाइंडिंग एक्सप्रेशन
- डेटा बाइंडिंग लाइब्रेरी
- व्यू बाइंडिंग