Android-DataBinding-बाइंडिंग कक्षाएं कैसे और कब उत्पन्न की जाएंगी?




data-binding (12)

डाटाबाइंडिंग गाइड स्टेट्स

  By default, a Binding class will be generated based on the name of the layout 
file, converting it to Pascal case and suffixing Binding to it. 
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.

बाइंडिंग क्लास कब होगा, यहां एक्टिविटी मेनबाइंडिंग कहा जाएगा। मेरे पास संकलन समय त्रुटि है। "ActivMainBinding को हल नहीं कर सकता"।

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);

किसी भी मदद की सराहना की है। धन्यवाद


नियम

लेआउट का नाम snake_case , और उत्पन्न बाइंडिंग क्लास नाम PascalCase होगा।

यदि आप लेआउट का नाम activity_home.xml तो बाध्यकारी वर्ग का नाम गतिविधिहोमबाइंडिंग .class होगा।

मुसीबत

  1. कई बार आपको डेटाबाइंडिंग क्लास का आयात सुझाव नहीं मिलता है।
  2. लेआउट में कुछ समस्या होने पर बाइंडिंग क्लास उत्पन्न नहीं होती है।
  3. बिल्ड फेल होने पर बाइंडिंग क्लास उपलब्ध नहीं है

यहाँ हैक है

जब आपको आयात सुझाव नहीं मिलता है

  • जब आपको आयात सुझाव नहीं मिलता है। इस तरह से अपने बाध्यकारी वर्ग को मैन्युअल रूप से आयात करें। (आईडीई अक्सर बाध्यकारी वर्गों के लिए सुझाव नहीं दिखाता है)

    import <yourpackage>databinding.ActivityMainBinding;

आयात लाइन अभी भी त्रुटि दिखाती है?

  • यदि आपकी आयात लाइन त्रुटि दिखाती है, तो प्रोजेक्ट बनाने का प्रयास करें (ctrl + F9) / Build> Make Project । ।
    1. यदि कुछ त्रुटि के कारण बिल्ड विफल है, तो इसे हल करें।
    2. अगर निर्माण सफल रहा तो बाध्यकारी वर्ग उत्पन्न होगा।

बाध्यकारी वर्ग उत्पन्न करने के लिए त्वरित हैक-

  • यदि आपका बाध्यकारी वर्ग उत्पन्न नहीं हुआ है तो परियोजना बंद करें (फ़ाइल> प्रोजेक्ट बंद करें) और हाल ही में खोलें

ध्यान दें कि मैं हाल ही में बंद करने और खोलने की सलाह देता हूं क्योंकि यह पुनर्निर्माण / पुनः आरंभ आईडीई की तुलना में कम समय लेता है।

बाध्यकारी वर्ग में लेआउट चर उत्पन्न करने के लिए त्वरित हैक-

  • यदि आपका लेआउट डेटा वैरिएबल जेनरेट नहीं हुआ है तो प्रोजेक्ट (फाइल> क्लोज प्रोजेक्ट) बंद करें और हाल ही में खोलें

अगर आपके पास अभी भी मुद्दे हैं। मुझे टिप्पणियों में बताएं, या बेहतर समझ के लिए इस उत्तर को देखें।


Android डेटाबाइंडिंग को ठीक से काम करने के लिए आपको gradle के लिए Android टूल (com.android.tools.build:gradle)> = 1.3.0 का उपयोग करना होगा।

तो आपका प्रोजेक्ट build.gradle जैसा दिखना चाहिए:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath "com.android.databinding:dataBinder:1.0-rc1"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

और मॉड्यूल build.gradle में वह प्लगइन होना चाहिए:

apply plugin: 'com.android.databinding'

आखिरकार, अपने मॉड्यूल में जांच लें कि आप नवीनतम बिल्डटूलवर्सन का उपयोग कर रहे हैं (अभी यह 22.0.1 है)। मुझे यकीन नहीं है कि इसकी आवश्यकता है लेकिन यह संभवतः आपको "प्रौद्योगिकी के खून बह रहा है" ^ _ ^ पर आपको अच्छा महसूस कराएगा।

buildToolsVersion '22.0.1'

अपने प्रोजेक्ट को फिर से बनाएँ और पुनर्निर्माण करें । यह संभव है कि परियोजना के पुनर्निर्माण के बिना आपको कुछ SomeLayoutBinding कक्षाएं उत्पन्न न हों।

एंड्रॉइड स्टूडियो में जो एप्लिकेशन मेनू से किया जा सकता है: Build -> Rebuild project


उसी मुद्दे का सामना किया।

"एक्टिविटी मेनेबाइंडिंग को हल नहीं कर सकता" का कारण यह है कि आपकी बाइंडिंग फ़ाइल जनरेट नहीं हुई है। प्रोजेक्ट को साफ और पुनर्निर्माण करने का प्रयास करें। यह भी सुनिश्चित करें कि आपने चरणों का पालन किया है:

  1. classpath "com.android.databinding: dataBinder: 1.0-rc4" -> इसे मुख्य मॉड्यूल कॉल फ़ाइल में शामिल करें
  2. अपने ऐप मॉड्यूल के लिए 'com.android.databinding' प्लगइन लागू करें जो आप बना रहे हैं
  3. स्वच्छ
  4. पुनर्निर्माण। के तहत जाँच करें, अगर build-> indermediates-> आपके पैकेज का नाम-> डेटाबाइंडिंग फ़ोल्डर, एक्टिविटी मेनबाइंडिंग क्लास से बना है।

वैकल्पिक रूप से यदि आप उत्पन्न स्रोत को देखना चाहते हैं।

  1. classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.7' -> आपके मुख्य मॉड्यूल पर लागू होता है।
  2. प्लगइन लागू करें: 'com.neenbedankt.android-apt' -> आप अनुप्रयोग मॉड्यूल के लिए
  3. उपयुक्त 'com.android.databinding: संकलक: 1.0-rc0' -> आपकी निर्भरता में शामिल हैं।

ये कक्षाएं पहली बिल्ड पर जेनरेट की जाएंगी। यह भी सुनिश्चित करें कि आपके एप्लिकेशन मॉड्यूल में ApplicationId आपके ऐप मॉड्यूल के AndroidManifest.xml में पैकेज नाम के समान है। उम्मीद है की यह मदद करेगा।


एंड्रॉइड-स्टूडियो में एक अजीब "बग" उत्पन्न BR.java फ़ाइल को @Bindable फ़ील्ड्स का उपयोग नहीं करने का कारण @Bindable है और अभी भी केवल _all संपत्ति है यदि कोई रेस / लेआउट निर्देशिका मौजूद नहीं है।

यह मेरे साथ तब हुआ जब मैं एक लाइब्रेरी बनाने के लिए "नो एक्टिविटी" ऐप बनाना चाहता था जिसमें मेरा अलग-अलग बाइंडेबल डेटा था।


जब मैं सार्वजनिक हो जाता हूं, तो अपनी वस्तु के खेतों के स्तर की जांच करें


जब यह बाध्यकारी वर्ग उत्पन्न नहीं कर रहा है, तो मैं एंड्रॉइड स्टूडियो को पुनरारंभ करता हूं। तब बाध्यकारी वर्ग उत्पन्न होगा। क्या यह एंड्रॉइड स्टूडियो के कैश के कारण नहीं है?

BTW, अगर आप android-apt का उपयोग कर रहे हैं, तो कृपया इसे देखें। क्योंकि इससे बाध्यकारी वर्ग उत्पन्न नहीं होगा।


मेरा अनुभव यह है कि Android Studio 3.1.3 ने "Build> Rebuild Project" पर क्लिक करने के बाद डेटाबाइंडिंग क्लास उत्पन्न किया। फ़ाइल को इसमें संग्रहीत किया गया था:

\ परियोजना \ एप्लिकेशन \ निर्माण \ उत्पन्न \ स्रोत \ उपयुक्त \ विकास \ डिबग \ परियोजना \ एंड्रॉयड \ एप्लिकेशन \ डेटा बाइंडिंग

हालांकि, एंड्रॉइड स्टूडियो ने अभी भी बाध्यकारी कोड को स्रोत कोड में "अज्ञात" के रूप में रिपोर्ट किया है।

अंत में इसे ठीक करने के लिए, मैंने मैन्युअल रूप से आयात विवरण जोड़ा:

import project.android.app.databinding। *;


मेरे मामले में एंड्रॉइड स्टूडियो को फिर से शुरू करना काम करता है। यह Android-apt में बग है


यदि आप android स्टूडियो को फिर से शुरू नहीं करना चाहते हैं, तो एक तरीका गतिविधि_main.xml का नाम बदलकर कुछ और करने के लिए है जैसे activity_m.xml और फिर इसे वापस गतिविधि_main.xml में बदल दें। यह एंड्रॉइड स्टूडियो को पुनरारंभ करने की तुलना में बहुत तेज है।

नाम बदलने के लिए, activity_main.xml पर राइट क्लिक करें और Refactor => नाम बदलें


यदि आप कभी भी अपना खुद का बाइंडिंग क्लास नाम देना चाहते हैं, तो क्लास के नाम के साथ data एलीमेंट में class एट्रिब्यूट जोड़ें

बाइंडिंग कक्षाओं का नाम बदला जा सकता है या डेटा तत्व के वर्ग विशेषता को समायोजित करके अलग-अलग पैकेज में रखा जा सकता है।

<data class="ContactItem">
    ...
</data>

<data class="com.example.ContactItem">
...
</data>

लेआउट का नाम बदलकर main_activity.xml करने का प्रयास करें।

मेरे मामले में, यह "activity_main.xml" के लिए बाध्यकारी वर्ग उत्पन्न करने के लिए काम नहीं किया।
लेकिन लेआउट फ़ाइल का नाम बदलकर main_activity.xml करने के लिए बस ठीक काम किया।


<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

// याद रखें जरूरत बिल्ड-> पुनर्निर्माण परियोजना





data-binding