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,Build工具版本23.0.1,Android SDK 23,SDK工具24.4.0


3
请随时为相应的问题投票:https
//youtrack.jetbrains.com/issue/KT-8007

1
您只需要拥有apply plugin: 'kotlin-kapt'最新版本的应用程序gradle文件即可。
Hesam,

私有lateinit var绑定:FragmentDataBinding是更好的初始化方式
Dino Sunny

Answers:


85

尝试使用以下配置:

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

应用程序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

1
我可以确认此答案解决了我的数据绑定和Kotlin问题
Rabie Jradi

12
我还必须添加apply plugin: 'kotlin-kapt'。见stackoverflow.com/a/42974558/1916449
arekolek '17

我试过了 现在,它给了我一个循环依赖错误。有什么想法吗?
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

这对我有用(渐变包装4.4,工具3.1.0)
Sergio

添加kapt'com.android.databinding:compiler:3.0.1'对我有用
Duran Jayson

它仅通过添加“ apply plugin:'kotlin-kapt”为我工作。谢谢。
Subhan Ali

刚刚添加的这一行对我有用(应用插件:'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,评论中的链接

更新这是一个非常简单的hello world示例项目


我仍然遇到相同的错误,我在这里做错了吗?gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

这是我的build.gradle文件,如果您需要参考gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@Jaydeep刚尝试过,它正在工作。但是,Android Studio不会突出显示语法,并会在message中生成很多IDE错误Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:。你有同样的错误吗?您的android studio版本是什么?
米哈伊尔(Mikhail)

@Arkadiy据报道youtrack.jetbrains.com/issue/KT-8007 BTW我正在Studio v1.5预览2
Jaydeep Solanki 2015年

这不再是插件的最新版本。会造成不必要的痛苦。
Avinash R

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

然后再次同步。如果看到此警告,请忽略它。

3rd-party Gradle插件可能是原因


6

试试这个Andrid Studio 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

我不得不添加应用插件:“科特林-kapt”
安德里·科瓦利丘克



3

重要更新

您可以在Android文档中看到

默认情况下启用版本3.2中的新编译器。

因此,只需将您的Android Studio 更新到V3.2更高版本即可。并删除所有不必要的配置。

因此,只需在应用程序级别启用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我只是用我的布局名称fragment_registeration_user这样的FragmentRegisterationUserBinding,并在数据绑定的布局使得它和错误走了。


你很棒!我花了很多时间来应用多个建议来解决该问题,但直到找到此答案之前,他们还是无能为力。根据片段布局名称更改绑定可以解决此问题。非常感谢。
阿贾伊

很高兴它帮助你
EL TEGANI穆罕默德·哈马德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_versioncom.android.tools.build:gradlein的版本application build.gradle

此外,将此添加到您的模块 build.gradle

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


0

使用Kotlin语言时,在android Project中添加数据绑定。

以下步骤

-首先,您需要添加以下插件

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

-第二数据绑定启用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;
            }

数据绑定Librabry kapt 'com.android.databinding:编译:2.3.1'
Shripal沙阿

0

就我而言,添加

kapt {
    generateStubs = true
}

为我解决了问题。我第一次忽略了它,我认为这与问题无关:

未解决的参考数据绑定

但是现在,数据绑定工作正常。


0

我想分享自己的经验。要在Android Studio中与Kotlin一起使用数据数据绑定,就足以添加

dataBinding {
    enabled = true
}

在“同步”之后,“制作项目”非常重要。之后,所有对象将被激活使用。


0

在尝试使用FragmentDetailsBinding之前,必须确保通过将整个布局包装在“”标记父级中并将所有xmlns移至layout标记中,然后将其构建,然后将其构建,就可以将相应的layout(fragment_details.xml)转换为数据绑定布局。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.