कोटलिन-एंड्रॉइड: अनसुलझे संदर्भ डेटाबाइंडिंग


143

मेरे पास नई डेटाबाइंडिंग लाइब्रेरी का उपयोग करके जावा में लिखे गए खंड वर्ग हैं

import com.example.app.databinding.FragmentDataBdinding;

public class DataFragment extends Fragment {

    @Nullable
    private FragmentDataBinding mBinding;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false);
        return mBinding.getRoot();
    }
}

यह संकलन करता है और ठीक चलता है।
मैंने कोटलिन में इसे फिर से लिखने की कोशिश की और निम्नलिखित के साथ आया:

import com.example.app.databinding.FragmentDataBdinding

class ProfileFragment : Fragment() {

    private var mBinding: FragmentDataBinding? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false)
        return mBinding!!.getRoot()
    }
}

लेकिन अब चरण :app:compileDebugKotlinनिम्न आउटपुट करता है:

त्रुटि: (१६, ३ 38) अनारक्षित संदर्भ: डेटाबाइंडिंग
त्रुटि: (३ 38, २ 38) अनारक्षित संदर्भ: फ्रैगमेंटडॉटबाइंडिंग

मैं कोटलिन के साथ एंड्रॉइड-डेटाबाइंडिंग लाइब्रेरी का उपयोग कैसे कर सकता हूं?

मेरा शीर्ष-स्तर build.gradle:

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

allprojects {
    repositories {
        jcenter()
    }
}

build.gradleऐप में मेरा नाम (केवल प्रासंगिक भाग):

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'
apply plugin: 'kotlin-android'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

buildscript {
    ext.kotlin_version = '0.14.451'
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}
repositories {
    mavenCentral()
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
}

मैं एंड्रॉइड स्टूडियो 1.4, बिल्ड टूल्स संस्करण 23.0.1, एंड्रॉइड एसडीके 23, एसडीके टूल्स 24.4.0 का उपयोग कर रहा हूं


3
कृपया, इस मुद्दे पर वोट देने के लिए स्वतंत्र महसूस करें: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon

1
आपको केवल apply plugin: 'kotlin-kapt'हाल ही के संस्करण में ऐप ग्रेड फ़ाइल में होना चाहिए।
हेसाम

निजी लेटीनिट var बाइंडिंग: FragmentDataBinding इनिशियलाइज़ करने का एक बेहतर तरीका है
डिनो सनी

जवाबों:


85

इस कॉन्फ़िगरेशन का उपयोग करने का प्रयास करें:

मुख्य बिल्ड.ग्रेड में :

buildscript {
    ext.kotlin_version = '<kotlin-version>'
    ext.android_plugin_version = '2.2.0-alpha4'
    dependencies {
        classpath "com.android.tools.build:gradle:$android_plugin_version"
    //... rest of the content
    }
}

App build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

dependencies {
    kapt "com.android.databinding:compiler:$android_plugin_version"
}

kapt {
    generateStubs = true
}

1
@Irampazzo, 2.2.0-alphaXउपलब्ध है, और FYI करें डेटा-बाइंडिंग का संस्करण एंड्रॉइड-ग्रेड-प्लग-इन के समान ही है। तो आप उस संस्करण को बाहरी कर सकते हैं और इसे संकलक के संस्करण के रूप में उपयोग कर सकते हैं।
अविनाश आर।

1
मैं इस बात की पुष्टि कर सकता हूं कि इस उत्तर ने मेरे मुद्दे को डेटबाइंडिंग और कोटलिन के साथ तय किया है
रबी जेडी

12
मुझे apply plugin: 'kotlin-kapt'भी जोड़ना था । देखें stackoverflow.com/a/42974558/1916449
arekolek

मैंने यह कोशिश की। अब यह मुझे एक परिपत्र निर्भरता त्रुटि देता है। इस बारे में कोई विचार?
leoOrion

इस पर आधिकारिक प्रलेखन के लिए kotlinlang.org/docs/tutorials/… देखें ।
ब्रायन

72

मुझे नया समाधान मिला, आशा है कि यह आपकी मदद करेगा।

सबसे पहले यह देखें कि क्या प्लगइन लागू है:

apply plugin: 'kotlin-kapt'

फिर

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

आपको निर्भरता में त्रुटि हो सकती है:

उपयोग

kapt 'com.android.databinding:compiler:3.0.1'

के बजाय

compile 'com.android.databinding:compiler:3.0.1'

आप नए संस्करण के लिए यहां जा सकते हैं

धन्यवाद।


6
मेरे पास अभी भी यह समस्या है :(
म्लाडेन रैकोनजैक

यह मेरे लिए काम कर रहा है (ढाल आवरण 4.4, उपकरण 3.1.0)
सर्जियो

Kapt को शामिल करते हुए 'com.android.databinding: compiler: 3.0.1' मेरे लिए काम करता है
दुरान जइसन

इसने मेरे लिए केवल "अप्लाई प्लगइन: 'कोटलिन-कप्ट" को जोड़कर काम किया। धन्यवाद।
सुभान अली

बस जोड़ा गया यह पंक्ति मेरे लिए काम कर रही है (प्लगइन लागू करें: 'kotlin-kapt') Android Studio 3.2.1 -
कोटलिन

14

अद्यतन 2: यह एक बहुत पुराना उत्तर है, इसके बजाय lrampazzo के उत्तर को देखें।

यह 1.0-rc4 के साथ काम करता है

kapt 'com.android.databinding:compiler:1.0-rc4' 

अपनी निर्भरता में

धन्यवाद Gedeon, टिप्पणियों में लिंक के लिए

अद्यतन : यहाँ एक बहुत ही सरल हैलो दुनिया उदाहरण परियोजना है


मुझे अभी भी वही त्रुटि मिलती है, क्या मैं यहां कुछ गलत कर रहा हूं? gist.github.com/xdgimf/820c433efa8307821788
मिगुएल

यदि आपको संदर्भ gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@ जयदीप ने अभी इसकी कोशिश की है, और यह काम कर रहा है। हालाँकि एंड्रॉइड स्टूडियो सिंटैक्स को उजागर नहीं करता है और संदेश के साथ बहुत सारी आईडीई त्रुटियों को उत्पन्न करता है Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:। क्या आपकी भी यही त्रुटियाँ हैं? और आपका Android स्टूडियो संस्करण क्या है?
मिखाइल

@Arkadiy यह पहले से ही सूचित कर दिया गया है youtrack.jetbrains.com/issue/KT-8007 BTW मैं स्टूडियो v1.5 पूर्वावलोकन 2 पर हूँ
जयदीप सोलंकी

यह अब प्लगइन का नवीनतम संस्करण नहीं है। इससे अनावश्यक दर्द होगा।
अविनाश आर।

13

डेटा बाइंडिंग कंपाइलर का संस्करण आपकी परियोजना build.gradle फ़ाइल में ग्रेडेल संस्करण के समान है:

// at the top of file 
apply plugin: 'kotlin-kapt'


android {
  dataBinding.enabled = true
}

dependencies {
  kapt "com.android.databinding:compiler:3.0.0-beta1"
}

और ग्रेड संस्करण है

classpath 'com.android.tools.build:gradle:3.0.0-beta1'

कोटलिन में डेटाबाइंडिंग लाइब्रेरी का उपयोग करने के लिए एक उदाहरण लिंक है।

https://proandroiddev.com/modern-android-development-with-kotlin-september-2017-part-1-f976483f7bd6


dataBinding.enabled = trueमैं क्या भूल रहा था
सीजर कास्त्रो

7

समस्या को हल करने के लिए, आपको रखना होगा

apply plugin: 'kotlin-kapt'

build.gradle (मॉड्यूल: ऐप) के शीर्ष पर, फिर इस लाइन को निर्भरता में रखें

kapt "com.android.databinding:compiler:[YOUR_ANDROID_PLUGIN_VERSION]"

आप मेनू पर जाकर एंड्रॉइड प्लगइन संस्करण पा सकते हैं

File > Project Structure > Project

फिर सिंक करें। यदि आप इस चेतावनी को देखते हैं, तो इसे अनदेखा करें।

तृतीय-पक्ष ग्रैडल प्लग-इन इसका कारण हो सकता है


6

यह कोशिश करो। और स्टूडियो 2.0 (2.1)

में build.gradle

android{
   dataBinding {
        enabled = true
    }
...
}
dependencies {
 kapt 'com.android.databinding:compiler:2.0.0-rc1'
....
}

kapt {
    generateStubs = true
}

मेरी परियोजना में: buildToolsVersion = "23.0.3"

शीर्ष स्तर में build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }

2
आपको कंपाइलर और एंड्रॉइड बिल्ड टूल्स ग्रेडल प्लगइन दोनों के लिए एक ही संस्करण का उपयोग करना चाहिए। अन्यथा यह अप्रत्याशित बिल्ड मुद्दों का कारण बन सकता है।
अविनाश आर।

मुझे लागू प्लगइन जोड़ना था: 'kotlin-kapt'
Andrii Kovalchuk


4

कोटलिन में कॉन्फ़िगरेशन डेटा बाइंडिंग

build.gradle (फ़ोल्डर ऐप)

apply plugin: 'kotlin-kapt'

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

dependencies {
   // data binding
   kapt "com.android.databinding:compiler:3.1.3"
}

कोटलिन का आनंद लें ...


प्लगइन लागू करें: कोटलिन में 'कोटलिन-कप्ट' वास्तव में महत्वपूर्ण है।
राहुल रस्तोगी

3

महत्वपूर्ण अद्यतन

आप Android के प्रलेखन में देख सकते हैं

संस्करण 3.2 में नया संकलक डिफ़ॉल्ट रूप से सक्षम है।

तो बस अपने Android स्टूडियो को V3.2 या नए में अपडेट करें । और सभी अनावश्यक कॉन्फ़िगरेशन को हटा दें।

तो बस ऐप लेवल में डेटाबाइंडिंग को सक्षम करें build.gradle

android {
    dataBinding {
        enabled = true
    }
}

यह आपके लिए सभी चीजें स्वचालित रूप से करेगा।

आप नीचे दी गई लाइनों को देख सकते हैं-

  • Databinding.compiler निकालें

    kapt 'com.android.databinding:compiler:3.0.1'
  • हटाना kapt

    kapt {
        generateStubs = true
    }

मेरा पूरा विन्यास

build.gradle (परियोजना)

kotlin_version = '1.2.71'    
classpath 'com.android.tools.build:gradle:3.2.0'

ग्रेडेल नवीनतम संस्करण का उपयोग करें । कोटलिन नवीनतम संस्करण का उपयोग करें ।

build.gradle (ऐप)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

compileSdkVersion 28
targetSdkVersion 28

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

महत्वपूर्ण केवल कॉपी और पेस्ट को कॉन्फ़िगर न करें। कोटलिन संस्करण स्थापित करने के लिए यह उत्तर देखें ।

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

मेरा प्रोजेक्ट अभी भी 3.0.1 रिलीज़ पर है, इसलिए यह मेरे लिए काम नहीं कर रहा है।
नौ

अधिक स्थिरता प्राप्त करने के लिए आप अपने Android Studio और gradle को अपडेट कर सकते हैं।
खेमराज

3

मेरे मामले में, त्रुटि यह थी कि Unresolved reference: RegisterationUserBindingमैंने अपने लेआउट नाम का fragment_registeration_userउपयोग इस तरह किया था FragmentRegisterationUserBindingऔर इसे डेटाबाइंडिंग लेआउट में बनाया और त्रुटि चली गई।


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

ख़ुशी हुई कि इससे आपको मदद मिली
EL TEGANI MOHAMED HAMMAD GABIR

2

आप में निम्नलिखित जोड़ें app build.gradle

kapt "com.android.databinding:compiler:$android_plugin_version"
apply plugin: 'kotlin-kapt' // This one at top where plugin belong to

यह चाल चलेगा।

$android_plugin_versionका संस्करण com.android.tools.build:gradleहैapplication build.gradle

इसके अलावा, इसे अपने मॉड्यूल में जोड़ें build.gradle

android { /// Existing Code kapt { generateStubs = true } }


0

जब आप कोटलिन भाषा का उपयोग करते हैं, तो एंड्रॉइड प्रोजेक्ट में डेटाबाइंडिंग जोड़ें।

चरणों के नीचे

- पहले आपको नीचे दिए गए प्लगइन को जोड़ने की आवश्यकता है

**apply plugin: 'kotlin-kapt'**

- डेटा से परे सक्षम सच है

**dataBinding {
        enabled = true
    }**

यह सब बिंदु "SYNC Now" हिट होने के बाद app.build.gradle में जोड़ा गया

उदाहरण के लिए, आपने प्रोफाइल गतिविधि को संपादित किया है तो कोटलिन में बाध्यकारी चर को कैसे परिभाषित किया जाए?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

यहां, बंधन प्राप्त करने की विधि है कि किस प्रकार की बाध्यकारी वस्तु को संभालना है

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }

DataBinding Librabry kapt 'com.android.databinding: संकलक: 2.3.1'
श्रीपाल शाह

0

मेरे मामले में, जोड़ना

kapt {
    generateStubs = true
}

मेरे लिए समस्या का समाधान किया। मैंने पहली बार इसे नजरअंदाज किया, मैंने सोचा कि यह समस्या के लिए अप्रासंगिक है:

अनारक्षित संदर्भ डेटाबाइंडिंग

लेकिन अब, डेटा-बाइंडिंग ठीक काम कर रहा है।


0

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

dataBinding {
    enabled = true
}

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


0

इससे पहले कि आप FragmentDetails का उपयोग करने का प्रयास करेंबाइंडिंग आपको यह सुनिश्चित करना है कि आप संबंधित लेआउट (fragment_details.xml) को डेटा लेआउट में संपूर्ण लेआउट को "" टैग में लपेटकर बाइंडिंग लेआउट में परिवर्तित कर लें और सभी xmlns को लेआउट टैग में ले जाएं और फिर प्रोजेक्ट बनाएं और इसे संपादित करें


-1

बस सभी डेटाबैंडिंग निर्भरता से बाहर निकलें और इसके बजाय इसका उपयोग करें

android {
    dataBinding {
        enabled = true
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.