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

Mikhail
quelle
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
}
lrampazzo
quelle
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.

Pratik Butani
quelle
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

Jaydeep Solanki
quelle
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

Sijansd
quelle
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

Sowattana Sigen
quelle
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'
    }
Garf1eld
quelle
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

Emad Pirayesh
quelle
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 ...

Jedsada Tiwongvorakul
quelle
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
Khemraj
quelle
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.

EL TEGANI MOHAMED HAMMAD GABIR
quelle
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
Ich bin
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 } }

RKS
quelle
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;
            }
Shripal Shah
quelle
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.

Mahmoud
quelle
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.

düster
quelle
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

TarekB
quelle
-1

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

android {
    dataBinding {
        enabled = true
    }
}
Kareem Alsaifi
quelle