Kotlin-android:未解決の参照データバインディング


143

新しいデータバインディングライブラリを使用してJavaで記述された次のフラグメントクラスがあります

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

コンパイルして正常に動作します。
私はKotlinでそれを書き直そうとして、次のことを思いつきました:

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は以下を出力します:

エラー:(16、38)未解決の参照:データバインディング
エラー:(37、27 )未解決の参照:FragmentDataBinding

Kotlinでandroid-databindingライブラリを使用するにはどうすればよいですか?

私のトップレベル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'
    }
}

Android Studio 1.4、ビルドツールバージョン23.0.1、Android SDK 23、SDKツール24.4.0を使用しています


3
対応する問題に自由に投票してください
//youtrack.jetbrains.com/issue/KT-8007

1
apply plugin: 'kotlin-kapt'最新バージョンのアプリグラドルファイルのみが必要です。
Hesam

private lateinit var binding:FragmentDataBindingは初期化のより良い方法です
Dino Sunny

回答:


85

この構成を使用してみてください:

メインの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
    }
}

アプリbuild.gradle

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}

1
@Irampazzo 2.2.0-alphaXが利用可能で、データバインディングのバージョンはandroid-gradle-plugin自体のバージョンと同じです。そのため、そのバージョンを外部化して、コンパイラのバージョンとして使用できます。
Avinash R 2016

1
この回答でデータバインディングとコトリンの問題が修正されたことを確認できます
Rabie Jradi

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
私はまだこの問題を抱えています:(
Mladen Rakonjac 2017

これは私のために働いています(gradle wrapper 4.4、tools 3.1.0)
Sergio

kapt 'com.android.databinding:compiler:3.0.1'を追加するとうまくいきます
Duran Jayson

「apply plugin: 'kotlin-kapt」のみを追加することで機能しました。ありがとう。
Subhan Ali 2018

この行が私のために働いていることを追加しました(適用プラグイン: 'kotlin-kapt')Android Studio 3.2.1-Kotlinプラグイン1.3.0
Mohamed ElSawaf

14

更新2:これは本当に古い答えですが、代わりにlrampazzoの答えを参照してください。

1.0-rc4で動作します。

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

あなたの依存関係に

コメントのリンクをありがとう、Ghedeon

更新ここにあります本当に簡単ハローワールドプロジェクト例


それでも同じエラーが発生しますが、ここで何か問題がありますか?gist.github.com/xdgimf/820c433efa8307821788
ミゲルフェルミン

参照が必要な場合は、ここに私のbuild.gradleファイルがあります。gist.github.com
jaydeep17 /

@Jaydeep試してみたところ、うまくいきました。ただし、Androidスタジオは構文を強調表示せず、メッセージとともに多くのIDEエラーを生成しますException while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:。同じエラーがありますか?そして、あなたのアンドロイドスタジオバージョンは何ですか?
ミハイル

@Arkadiyすでに報告されていますyoutrack.jetbrains.com/issue/KT-8007 BTW私はスタジオv1.5にいますプレビュー2
Jaydeep Solanki

これはプラグインの最新バージョンではありません。不要な痛みを引き起こします。
Avinash R 2016

13

データバインディングコンパイラのバージョンは、プロジェクトのbuild.gradleファイルのgradleバージョンと同じです。

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


android {
  dataBinding.enabled = true
}

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

そしてgradleバージョンは

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

これは、kotlinでデータバインディングライブラリを完全に使用するためのリンクの例です。

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


dataBinding.enabled = true私が忘れていたものでした
Cesar Castro

7

問題を解決するには、

apply plugin: 'kotlin-kapt'

build.gradle(モジュール:app)の一番上に、次にこの行を依存関係に入れます

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

メニューに移動すると、Androidプラグインのバージョンを確認できます

File > Project Structure > Project

次に、もう一度同期します。この警告が表示された場合は、無視してください。

サードパーティのGradleプラグインが原因である可能性があります


6

これを試してください。Andridstudio 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
コンパイラとAndroidビルドツールのGradleプラグインの両方に同じバージョンを使用する必要があります。そうしないと、予期しないビルドの問題が発生する可能性があります。
Avinash R 2016

適用プラグインを追加する必要がありました: 'kotlin-kapt'
Andrii Kovalchuk


4

Kotlinでの構成データのバインド

build.gradle(フォルダーアプリ)

apply plugin: 'kotlin-kapt'

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

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

Kotlinをお楽しみください...


プラグインを適用する:Kotlinでは「kotlin-kapt」が本当に重要です。
Rahul Rastogi、

3

重要な更新

Androidのドキュメントで見ることができます

バージョン3.2の新しいコンパイラはデフォルトで有効になっています。

だから、ただ、アップデートはあなたのV3.2へのAndroidメーカーまたはそれ以降。不要な構成をすべて削除します。

したがって、アプリレベルでdataBindingを有効にします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'

Gradleの最新バージョンを使用してください。kotlin最新バージョンを使用してください。

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"

重要設定をコピーして貼り付けるだけではありません。Kotlinバージョンの設定については、この回答を参照してください。

gradle-wrapper.properties

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

私のプロジェクトはまだgradle 3.0.1リリースであるので、これは私にはうまくいきませんでした。
naqi

Android StudioとGradleを更新して、安定性を高めることができます。
Khemraj

3

私の場合、エラーはこのようにUnresolved reference: RegisterationUserBindingレイアウト名を使用してDatabindingレイアウトで作成しただけで、エラーは解消されました。fragment_registeration_userFragmentRegisterationUserBinding


あなたは素晴らしいです!私は問題を解決するために複数の提案を適用するために多くの時間を費やしましたが、この答えを見つけるまで無力でした。フラグメントレイアウト名に従ってバインディングを変更すると、問題が解決します。どうもありがとう。
Ajay、

それはあなたを助けて喜ん
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:gradleapplication build.gradle

また、これをモジュールに追加します build.gradle

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


0

Kotlin言語を使用している場合は、Androidプロジェクトにデータバインディングを追加します。

手順の下

-まず、以下のプラグインを追加する必要があります

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

--2番目のdataBindingが有効ですtrue

**dataBinding {
        enabled = true
    }**

このすべてのポイントは、「今すぐ同期」を押した後にapp.build.gradleに追加されました

たとえば、プロファイルアクティビティを編集してから、kotlinでバインディング変数を定義する方法を教えてください。

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

ここで、get bindingは、どのタイプのバインディングオブジェクトを処理するメソッドです。

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

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

0

私の場合、追加

kapt {
    generateStubs = true
}

私のために問題を解決しました。私はそれを初めて無視しました、それは問題とは無関係であると思いました:

未解決の参照データバインディング

しかし、現在、データバインディングは正常に機能しています。


0

私自身の経験を共有したいと思います。Android StudioのKotlinでデータデータバインディングを使用するには、追加するだけで十分です

dataBinding {
    enabled = true
}

その後、「同期して」、そして「プロジェクトを作成する」ことが非常に重要です。その後、すべてのオブジェクトがアクティブに使用できるようになります。


0

FragmentDetailsBindingを使用する前に、レイアウト全体を ""タグの親でラップし、すべてのxmlnsをレイアウトタグに移動して、対応するレイアウト(fragment_details.xml)をデータバインディングレイアウトに変換し、プロジェクトをビルドする必要があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.