Kotlin-android: ungelöste Referenzdatenbindung


143

Ich habe folgende Fragmentklasse in Java mit der neuen Datenbindungsbibliothek geschrieben

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();
    }
}

Es kompiliert und läuft gut.
Ich habe versucht, es in Kotlin umzuschreiben, und dabei Folgendes gefunden:

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()
    }
}

Jetzt :app:compileDebugKotlingibt step jedoch Folgendes aus:

Fehler: (16, 38) Nicht aufgelöste Referenz: Datenbindung
Fehler: (37, 27) Nicht aufgelöste Referenz: FragmentDataBinding

Wie kann ich die Android-Datenbindungsbibliothek mit Kotlin verwenden?

Meine oberste Ebene 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()
    }
}

Mein build.gradleIn-App-Verzeichnis (nur relevante Teile):

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'
    }
}

Ich verwende Android Studio 1.4, Build Tools Version 23.0.1, Android SDK 23, SDK Tools 24.4.0


3
Bitte
zögern

1
Sie müssen nur apply plugin: 'kotlin-kapt'in der App Gradle-Datei in der neuesten Version haben.
Hesam

private lateinit var binding: FragmentDataBinding Ist eine bessere Methode zum Initialisieren
Dino Sunny

Antworten:


85

Versuchen Sie diese Konfiguration zu verwenden:

In main build.gradle :

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-alphaXist verfügbar, und zu Ihrer Information ist die Version der Datenbindung dieselbe wie die des Android-Gradle-Plugins selbst. Sie können diese Version also externalisieren und als Compilerversion verwenden.
Avinash R

1
Ich kann bestätigen, dass diese Antwort mein Problem mit Datenbindung und Kotlin behoben hat
Rabie Jradi

12
Ich musste auch hinzufügen apply plugin: 'kotlin-kapt'. Siehe stackoverflow.com/a/42974558/1916449
arekolek

Ich habe es versucht. Jetzt gibt es mir einen zirkulären Abhängigkeitsfehler. Irgendeine Idee dazu?
LeoOrion

Eine offizielle Dokumentation hierzu finden Sie unter kotlinlang.org/docs/tutorials/… .
Brian

72

Ich habe eine neue Lösung gefunden, hoffe sie hilft dir.

Überprüfen Sie zunächst, ob das Plugin angewendet wurde:

apply plugin: 'kotlin-kapt'

dann

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

Möglicherweise liegt ein Fehler in der Abhängigkeit vor:

VERWENDEN

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

anstatt

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

Sie können hier für eine neue Version besuchen

Danke dir.


6
Ich habe immer noch dieses Problem :(
Mladen Rakonjac

Dies funktioniert für mich (Gradle Wrapper 4.4, Tools 3.1.0)
Sergio

Das Hinzufügen von kapt 'com.android.databinding: compiler: 3.0.1' funktioniert für mich
Duran Jayson

Es funktionierte für mich, indem nur "Apply Plugin: 'kotlin-kapt" hinzugefügt wurde. Vielen Dank.
Subhan Ali

gerade hinzugefügt, diese Zeile funktioniert für mich (Plugin anwenden: 'kotlin-kapt') Android Studio 3.2.1 - Kotlin Plugin 1.3.0
Mohamed ElSawaf

14

Update 2: Dies ist eine wirklich alte Antwort. Beziehen Sie sich stattdessen auf die Antwort von lrampazzo.

Es funktioniert mit 1.0-rc4, setzen

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

in Ihre Abhängigkeiten

Danke Ghedeon für den Link in den Kommentaren

Update : Hier ist ein wirklich einfaches Hallo-Welt-Beispielprojekt


Ich erhalte immer noch den gleichen Fehler. Mache ich hier etwas falsch? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

Hier ist meine build.gradle-Datei, wenn Sie eine Referenz benötigen. gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@ Jaydeep Habe es gerade versucht und es funktioniert. Android Studio hebt jedoch die Syntax nicht hervor und generiert viele IDE-Fehler mit Nachrichten Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Haben Sie die gleichen Fehler? Und was ist deine Android Studio Version?
Mikhail

@Arkadiy Es wurde bereits berichtet youtrack.jetbrains.com/issue/KT-8007 Übrigens bin ich auf Studio v1.5 Vorschau 2
Jaydeep Solanki

Dies ist nicht mehr die neueste Version des Plugins. Es wird unnötige Schmerzen verursachen.
Avinash R

13

Die Version des Datenbindungs-Compilers entspricht der Gradle-Version in Ihrer Projektdatei 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"
}

und die gradle version ist

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

Hier ist ein Beispiellink zum Abschluss der Verwendung der Datenbindungsbibliothek in Kotlin.

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


dataBinding.enabled = truewar das, was ich vergessen habe
Cesar Castro

7

Um das Problem zu lösen, müssen Sie setzen

apply plugin: 'kotlin-kapt'

Fügen Sie diese Zeile oben in build.gradle (Modul: App) in Abhängigkeiten ein

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

Sie können die Android Plugin Version finden, indem Sie zum Menü gehen

File > Project Structure > Project

Dann erneut synchronisieren. Wenn Sie diese Warnung sehen, ignorieren Sie sie.

Gradle-Plug-Ins von Drittanbietern können die Ursache sein


6

Versuchen Sie dies.Andrid Studio 2.0 (2.1)

In build.gradle

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

kapt {
    generateStubs = true
}

In meinem Projekt: buildToolsVersion = "23.0.3"

in der obersten Ebene build.gradle

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

2
Sie sollten dieselbe Version sowohl für den Compiler als auch für das Gradle-Plugin des Android Build Tools verwenden. Andernfalls kann es zu unvorhersehbaren Build-Problemen kommen.
Avinash R

Ich musste ein Apply-Plugin hinzufügen: 'kotlin-kapt'
Andrii Kovalchuk

6

diese arbeit für mich in androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

Verwendungsbeispiel anzeigen


4

Konfigurationsdatenbindung in Kotlin

build.gradle (Ordner-App)

apply plugin: 'kotlin-kapt'

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

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

Viel Spaß mit Kotlin ...


Plugin anwenden: 'kotlin-kapt' ist in Kotlin wirklich wichtig.
Rahul Rastogi

3

Wichtiges Update

Sie können in der Dokumentation von Android sehen.

Der neue Compiler in Version 3.2 ist standardmäßig aktiviert.

So aktualisieren Sie einfach Ihr Android Studio V3.2 oder neuere . und entfernen Sie alle unnötigen Konfigurationen.

Aktivieren Sie also einfach dataBinding auf App-Ebene build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Es wird alles automatisch für Sie erledigen.

Sie können sicher unter den Zeilen entfernen-

  • Entfernen Sie database.compiler

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

    kapt {
        generateStubs = true
    }

Meine komplette Konfiguration

build.gradle (Projekt)

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

Verwenden Sie die neueste Version von gradle . Verwenden Sie die neueste Version von kotlin .

build.gradle (App)

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"

Wichtig Kopieren Sie nicht nur die Konfiguration und fügen Sie sie ein. In dieser Antwort finden Sie Informationen zum Einrichten der Kotlin-Version.

gradle-wrapper.properties

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

Mein Projekt befindet sich noch in Gradle 3.0.1, daher hat dies bei mir nicht funktioniert.
Naqi

Sie können Ihr Android Studio aktualisieren und gradle, um mehr Stabilität zu erreichen.
Khemraj

3

In meinem Fall war der Fehler Unresolved reference: RegisterationUserBindinghabe ich nur mein Layout Namen fragment_registeration_userwie diese FragmentRegisterationUserBindingund machte es in der Databinding - Layout und der Fehler ging weg.


Du bist großartig! Ich habe viel Zeit damit verbracht, mehrere Vorschläge zur Lösung des Problems zu machen, aber hilflos, bis ich diese Antwort gefunden habe. Durch Ändern der Bindung gemäß dem Namen des Fragmentlayouts wird das Problem behoben. Vielen Dank.
Ajay


2

Füge folgendes hinzu app build.gradle

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

Dies wird den Trick machen.

$android_plugin_versionist die Version von com.android.tools.build:gradleinapplication build.gradle

Fügen Sie dies auch Ihrem Modul hinzu build.gradle

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


0

Fügen Sie die Datenbindung in Android Project hinzu, wenn Sie die Kotlin-Sprache verwendet haben.

Unten Schritte

- Zuerst müssen Sie das folgende Plugin hinzufügen

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

- Zweite Datenbindung aktiviert true

**dataBinding {
        enabled = true
    }**

All dieser Punkt wurde in app.build.gradle hinzugefügt, nachdem auf "SYNC NOW" geklickt wurde.

Lets Zum Beispiel haben Sie Profilaktivität bearbeiten, wie man dann Bindungsvariable in Kotlin definiert?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Get Binding ist hier eine Methode, um zu behandeln, welche Art von Bindungsobjekt

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

DataBinding Librabry kapt 'com.android.databinding: Compiler: 2.3.1'
Shripal Shah

0

In meinem Fall hinzufügen

kapt {
    generateStubs = true
}

Das Problem wurde für mich gelöst. Ich habe es das erste Mal ignoriert und dachte, es sei für das Problem irrelevant:

Ungelöste Referenzdatenbindung

Aber jetzt funktioniert die Datenbindung einwandfrei.


0

Ich möchte meine eigene Erfahrung teilen. Die Verwendung der Datendatenbindung mit Kotlin in Android Studio reicht aus, um sie hinzuzufügen

dataBinding {
    enabled = true
}

Danach "synchronisieren" und, es ist sehr wichtig, "Projekt machen". Danach ist Ihr gesamtes Objekt aktiv.


0

Bevor Sie versuchen, FragmentDetailsBinding zu verwenden, müssen Sie sicherstellen, dass Sie das entsprechende Layout (fragment_details.xml) in ein Datenbindungslayout konvertiert haben, indem Sie das gesamte Layout in das übergeordnete Tag "" einschließen und alle XML-Dateien in das Layout-Tag verschieben, dann das Projekt erstellen und fertig


-1

Verlassen Sie einfach alle Datenbindungsabhängigkeiten und verwenden Sie diese stattdessen

android {
    dataBinding {
        enabled = true
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.