जनरेट की गई बाइंडिंग क्लास

डेटा बाइंडिंग लाइब्रेरी बाइंडिंग क्लास जनरेट करती है. इनका इस्तेमाल के वैरिएबल और व्यू शामिल हैं. इस दस्तावेज़ में बताया गया है कि जनरेट की गई बाइंडिंग क्लास को पसंद के मुताबिक बनाने के लिए किया जा सकता है.

जनरेट की गई बाइंडिंग क्लास, लेआउट वैरिएबल को लेआउट. आप इसके नाम और पैकेज को कस्टमाइज़ कर सकते हैं बाइंडिंग. जनरेट की गई सभी बाइंडिंग क्लास 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>

अन्य संसाधन

डेटा बाइंडिंग के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अतिरिक्त संसाधन देखें.