android - डेटा बाइंडिंग वर्ग उत्पन्न नहीं हुआ




data-binding android-databinding (12)

मैं अपने प्रोजेक्ट में डेटा बाइंडिंग का उपयोग कर रहा हूं, जब मेरे xml बाध्यकारी वर्ग में <layout> और <data> का उपयोग नहीं किया गया है।

उदाहरण के लिए मेरे पास activity_main.xml है

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

अब अगर मैं अपनी गतिविधि / ActivityMainBinding में गतिविधिमाइंड ActivityMainBinding लिख रहा हूँ तो यह पता चलता है कि कक्षा उपलब्ध नहीं है। लेकिन मेरी xml फ़ाइल में <variable> को शामिल करने के बाद, यह ActivityMainBinding क्लास उत्पन्न करने में सक्षम है।

एंड्रॉइड स्टूडियो: 2.1.3
क्लासपाथ: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


1. एप्लिकेशन में नीचे जोड़ें

 dataBinding {
        enabled = true
    }

2. xml लेआउट कोड के नीचे लिखें

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

DataBinding वर्ग स्वचालित रूप से उत्पन्न।

यदि आपका xml नाम गतिविधि_test है, तो बाइंडिंग वर्ग एक्टिविटीटेबाइंडिंग होगा।

परंतु,

dataBinding {
        enabled = true
    }

लेआउट में रूट के रूप में लेआउट होना चाहिए

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

इसे ठीक से सेट करने के बाद (xml नाम स्थान सहित और सब कुछ <layout> में लपेटकर), जो मेरे लिए काम करता है वह बिल्ड -> मेक प्रोजेक्ट कर रहा था। न ही स्वच्छ परियोजना या पुनर्निर्माण परियोजना। 26.0.2 बिल्ड टूल का उपयोग करके मैं एंड्रॉइड स्टूडियो 2.3.1 में हूं। <data> टैग की कोई आवश्यकता नहीं है।


जब आप एक मल्टीमॉडल एंड्रॉइड एप्लिकेशन के साथ काम करते हैं तो अपने बाध्यकारी क्लास पथ की जांच करें। शायद आपको उपयोग करना चाहिए:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding

import com.yourcompany.app.android.databinding.FragmentABCtBinding


मुझे कोई संतोषजनक जवाब नहीं मिला। तो यहाँ युक्तियाँ हैं जो मेरे डेटा बाइंडिंग ज्ञान का सारांश है।

DataBinding मुद्दों को सुलझाने के लिए युक्तियाँ

अद्यतन करें

अधिक सटीक त्रुटियों और सुझावों को प्राप्त करने के लिए, मैं एंड्रॉइड स्टूडियो और ग्रेडल प्लगइन संस्करण को नवीनतम रूप से अपडेट करने की दृढ़ता से सलाह देता हूं। क्योंकि मैं 3.2 संस्करण के बाद कई मुद्दों का सामना नहीं कर रहा हूं।

नवीनतम एंड्रॉइड स्टूडियो , और नवीनतम ग्रेडल प्लगिन देखें

Orignal Solution

इस उत्तर को पढ़ने के बाद, आप क्लास और डेटा वेरिएबल्स दोनों के लिए डेटा बाइंडिंग ऑटो जनरेशन समस्याओं में नहीं फंसेंगे

एक-एक करके इन बिंदुओं की जांच करें। इनमें से कोई भी आपके काम आ सकता है। बिंदु 3 से अंतिम वास्तव में महत्वपूर्ण हैं, इसलिए उन्हें याद न करें।

1. जांचें कि क्या डेटा-बाइंडिंग सक्षम है

आपके पास build.gradle में डेटा बाइंडिंग सक्षम होनी चाहिए। यदि नहीं, तो इसे और सिंक जोड़ें।

android {
...
   dataBinding {
        enabled = true
    }
...
}

2. चेक लेआउट बाध्यकारी लेआउट में परिवर्तित हो जाता है

अब यदि आप चाहते हैं कि डेटा बाइंडिंग क्लास उत्पन्न हो, तो आपको डेटा बाइंडिंग ( <layout टैग) के साथ xml layout लपेटना चाहिए। कुछ इस तरह।

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

3. ऑटो-जनरेटेड बाइंडिंग क्लास नाम?

बाध्यकारी लेआउट बनाने के बाद आपका डेटा बाध्यकारी वर्ग उत्पन्न किया जाना चाहिए।

यदि आपका लेआउट नाम साँप केस activity_main.xml तो activity_main.xml बाइंडिंग की तरह ऊंट मामले में डेटा बाइंडिंग क्लास उत्पन्न होगा।

4. आयात सुझाव नहीं देख सकते हैं?

कभी-कभी जब आप ActivityMai... टाइप करते हैं ActivityMai... , तो यह सुझाव नहीं दिखाता है , उस स्थिति में मैन्युअल रूप से आयात करें

    import <yourpackage>databinding.ActivityMainBinding;

5. बिल्ड फेल लॉगकाट पढ़ें

यदि आपका निर्माण विफल हो जाता है तो लेआउट में आपका बाध्यकारी वर्ग और नए चर उत्पन्न नहीं होंगे। तो पहले Ctrl + F9 द्वारा प्रोजेक्ट बनाएं (बिल्ड> मेक प्रोजेक्ट)

  • यदि बिल्ड विफल हो जाता है तो देखें कि त्रुटि क्या है, आमतौर पर हमारे पास लेआउट क्षेत्रों में त्रुटियां हैं। त्रुटि लॉग समस्या के साथ त्रुटि लाइन संख्या को इंगित करेगा।
  • बाइंडिंग कुछ बेवकूफ त्रुटि का कारण हो सकता है, जैसे वाक्यविन्यास त्रुटि या लापता आयात। उस स्थिति में आपको बाध्यकारी वर्गों की त्रुटियों से भरा लॉगकोट मिलेगा। लेकिन आपको उचित समस्या का पता लगाने के लिए पूर्ण लॉगकोट पढ़ना चाहिए

6. हाल ही में बंद और खुला प्रोजेक्ट

मैं हमेशा ऐसा करता हूं क्योंकि Rebuild / निर्माण परियोजना की तुलना में बहुत कम समय लगता है।

  • फ़ाइल से प्रोजेक्ट को बंद करें> प्रोजेक्ट को बंद करें
  • हाल ही में फिर से खोलें

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

7. परियोजना का पुनर्निर्माण

यदि फिर भी आपकी कक्षा उत्पन्न नहीं हुई है। (कुछ समय जब हम लेआउट फ़ाइल पेस्ट करते हैं, तब ऐसा होता है)। फिर Build> Rebuild से प्रोजेक्ट का पुनर्निर्माण करें Build> Rebuild ( बिल्ड नहीं या प्रोजेक्ट बनाएं )। यह आपके डेटा बाइंडिंग क्लास उत्पन्न करेगा। ( मेरे लिए जादू का पुनर्निर्माण करता है। )

8. नवीनतम Android स्टूडियो है

AS को Android Studio 3.2 में अपडेट करने के बाद, मैंने डेटा बाइंडिंग ऑटो जेनरेशन में कई बग फिक्स महसूस किए। तो आपके पास भी नवीनतम एएस होना चाहिए।

<variables लिए समाधान

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

आमतौर पर जब हम लेआउट में चर डालते हैं, तो यह गेटटर और सेटर बनाता है। और हम binding.setItem(item); उपयोग कर सकते हैं। binding.setItem(item); और binding.getItem(); , लेकिन यदि आप उस विधियों को नहीं देख सकते हैं तो नीचे दी गई जानकारी पढ़ें।

1. हाल ही में बंद और खुला प्रोजेक्ट

यदि आपने अपने लेआउट में एक डेटा वैरिएबल - <variable बनाया है और यह डेटा बाइंडिंग क्लास में अपना सेटर और गेट्टर नहीं दिखाता है , तो अपने प्रोजेक्ट से हाल ही में बंद और खोलें

2. प्रकार बदलने के बाद स्वच्छ परियोजना

यदि आपने अपने लेआउट में कुछ <variable का प्रकार बदल दिया है और गेट्टर सेटर प्रकार नहीं बदल रहा है तो स्वच्छ परियोजना ( Build> Clean Project )

अंतिम शब्द

अंत में यदि अभी भी आपका बाध्यकारी वर्ग उत्पन्न नहीं हुआ है, तो हमारे पास हमारा सबसे शक्तिशाली हथियार है। - एंड्रॉइड स्टूडियो को पुनरारंभ करें: डी

  • पहले बस पुनः आरंभ करने का प्रयास करें, यह हमेशा पुनरारंभ करने के बाद मेरे बाइंडिंग लेआउट के चर उत्पन्न करता है।
  • अगर काम नहीं करता है तो अमान्य कैश और पुनरारंभ करें

यह वह सब है जो मैं अपने डेटा बाइंडिंग त्रुटियों को हल करने के लिए करता हूं। यदि आपको कोई और मुद्दा मिलता है, तो आप यहां टिप्पणी कर सकते हैं।


मुझे नहीं पता कि यह आपके लिए काम करेगा या नहीं। बस लेआउट XML फ़ाइल नाम का नाम बदलें । मान लीजिए कि आपका लेआउट नाम गतिविधि_main.xml है, तो इसे मुख्य नाम xxml जैसी किसी भी चीज़ में बदल दें और फिर से इसे गतिविधि_main.xml में बदल दें। फिर आप एक्टिविटी मेनबाइंडिंग पर आयात विकल्प देख सकते हैं।

आशा है कि यह आप के लिए काम करता है।


मुझे मुद्दा मिल गया और समस्या लेआउट में थी जिसका उपयोग फ़ील्ड स्ट्रिंग नहीं था, यह एक तिथि थी।

ऐसा लगता है कि सभी फ़ील्ड को टेक्स्ट के लिए काम करना पड़ता है, कम से कम टेक्स व्यू घटक के साथ।

यदि आप कमांड के साथ निर्माण करते हैं ।/gradlew build --stacktrace

यह त्रुटियों को बेहतर दिखाता है।


मेरी भी यही समस्या थी। Android sdk डॉक्स पर पढ़ने के बाद, केवल अपेक्षित फ़ाइल नाम बनाया जाना है, लेकिन ऐसा नहीं होने पर क्या करना है, इसके बारे में कुछ भी नहीं। मैंने कुछ और शोध के बाद देखा कि नीचे दिए गए लेआउट तत्व जैसे नाम स्थान को हटाने के बाद (आपके उदाहरण का उपयोग करके), इसने मेरे लिए काम किया।

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

मेरे मामले में, बाइंडिंग वर्ग उत्पन्न हुआ था और (लेकिन मुझे लगा कि यह नहीं था) ... लेकिन यह स्वचालित रूप से उक्त वर्ग के आयात को गतिविधि / टुकड़ा आयात अनुभाग में नहीं जोड़ता है ... इसलिए ... विकल्प + दर्ज :)


मेरे मामले में, मैंने सोचा था कि उत्पन्न वर्ग को src फ़ोल्डर में मेरी सामान्य कक्षाओं के साथ दिखाई देना था। इसके अलावा, मैंने सोचा कि उत्पन्न वर्ग का नाम थोड़ा अलग होना चाहिए। यह सब मेरी गलती थी। उत्पन्न वर्ग build फ़ोल्डर में पाया जा सकता है, build -> generated -> ... पथ। यदि आपकी गतिविधि में उत्पन्न वर्ग का कोई आयात नहीं है, तो आयात जोड़ें

import com.yourcompany.app.databinding.ActivityMainBinding;"

वर्ग पथ का उपयोग करें 'com.android.databinding: dataBinder: 1.0-rc0'


इस उत्तर के लिए यहां धन्यवाद - ऐसा लगता है कि "लेआउट नेमस्पेस" को या तो साफ करने की आवश्यकता है, या आपको एक नए अद्वितीय नाम की आवश्यकता है।

यहां मेरे लिए काम करने वाले विकल्प दिए गए हैं:

  1. यह सुनिश्चित करने के लिए कि यह उत्पन्न किया जा सकता है लेआउट के लिए एक नया नाम बनाएँ। इसने मेरी समस्या को हल किया, जहां मेरे पास एक लेआउट था जो पहली बार बनाया गया था , डेटा बाइंडिंग के बिना - चलो इसे fragment_abc.xml कहते fragment_abc.xml । जब मैंने इसमें डेटा बाइंडिंग को जोड़ने की कोशिश की, तो यह पहचाना नहीं गया - कई स्पष्ट कैश और पुनरारंभ कॉल के बाद भी। हालाँकि, जैसे ही मैंने लेआउट की एक प्रतिलिपि बनाई, fragment_abc2.xml तुरंत ही डेटा-बाइंडिंग .java / /class ऑब्जेक्ट के fragment_abc2.xml दिए।

  2. उपरोक्त कार्य को देखने के बाद, मैंने मॉड्यूल से सिर्फ / बिल्ड फ़ोल्डर को हटाने की कोशिश की, और प्रोजेक्ट को फिर से बनाया - इसने मूल लेआउट के लिए डेटा बाइंडिंग प्राप्त करने के लिए काम किया।





android-databinding