Kotlin-android:未解决的参考数据绑定

Posted

技术标签:

【中文标题】Kotlin-android:未解决的参考数据绑定【英文标题】:Kotlin-android: unresolved reference databinding 【发布时间】:2016-01-14 21:39:20 【问题描述】:

我使用新的数据绑定库用 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

【问题讨论】:

请为相应的问题投票:https://youtrack.jetbrains.com/issue/KT-8007 您只需要在最新版本的应用程序gradle文件中包含apply plugin: 'kotlin-kapt' private lateinit var binding : FragmentDataBinding 是一种更好的初始化方式 【参考方案1】:

更新 2:这是一个非常古老的答案,请参阅 lrampazzo 的答案。

它适用于 1.0-rc4,放

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

进入你的依赖项

感谢 Ghedeon,提供 cmets 中的链接

更新:Here's 一个非常简单的 hello world 示例项目

【讨论】:

我仍然得到同样的错误,我在这里做错了吗? gist.github.com/xdgimf/820c433efa8307821788 这是我的 build.gradle 文件,如果您需要参考 gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d @Jaydeep 刚刚尝试过,它正在工作。但是,Android Studio 不会突出显示语法,并会生成大量带有消息 Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt: 的 IDE 错误。你有同样的错误吗?你的 android studio 版本是多少? @Arkadiy 已经报道过youtrack.jetbrains.com/issue/KT-8007 BTW 我在studio v1.5 Preview 2 这不再是插件的最新版本。会造成不必要的痛苦。【参考方案2】:

试试这个。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'
    

【讨论】:

您应该为编译器和 android 构建工具 gradle 插件使用相同的版本。否则可能会导致不可预知的构建问题。 我必须添加应用插件:'kotlin-kapt'【参考方案3】:

尝试使用此配置:

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

【讨论】:

@Irampazzo,2.2.0-alphaX 可用,仅供参考,数据绑定的版本与 android-gradle-plugin 本身的版本相同。因此您可以将该版本外部化并将其用作编译器的版本。 我可以确认这个答案解决了我的数据绑定和 kotlin 问题 我还必须添加apply plugin: 'kotlin-kapt'。见***.com/a/42974558/1916449 我试过这个。现在它给了我一个循环依赖错误。有什么想法吗? 查看kotlinlang.org/docs/tutorials/… 以获取有关这方面的官方文档。【参考方案4】:

我找到了新的解决方案,希望对您有所帮助。

首先检查插件是否应用:

apply plugin: 'kotlin-kapt'

然后

android 
    ...
    ...
    dataBinding 
        enabled = true
    
    ...
    ...

你的依赖可能有错误:

使用

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

而不是

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

您可以访问here获取新版本

谢谢。

并且在使用它的绑定类之前在布局文件中使用布局标签,你可以很容易地做到这一点: 在布局文件中,您的根视图(例如 - 约束布局)ALT+Enter -> 转换为数据绑定类

【讨论】:

我还是有这个问题:( 这对我有用(gradle wrapper 4.4,tools 3.1.0) 添加 kapt 'com.android.databinding:compiler:3.0.1' 对我有用 只添加“应用插件:'kotlin-kapt”对我有用。谢谢。 刚刚添加此行对我有用(应用插件:'kotlin-kapt')Android Studio 3.2.1 - Kotlin 插件 1.3.0【参考方案5】:

Data Binding 编译器的版本与你的项目 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 是我忘记的【参考方案6】:

使用 kotlin 语言在 android 项目中添加数据绑定。

以下步骤

--首先你需要添加下面的插件

**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;
            

【讨论】:

DataBinding 库 kapt 'com.android.databinding:compiler:2.3.1'【参考方案7】:

就我而言,添加

kapt 
    generateStubs = true

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

未解决的参考数据绑定

但是现在,数据绑定工作得很好。

【讨论】:

【参考方案8】:

在你里面添加关注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:gradleapplication build.gradle 中的版本

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

android /// Existing Code kapt generateStubs = true

【讨论】:

【参考方案9】:

要解决问题,你必须把

apply plugin: 'kotlin-kapt'

在 build.gradle (Module: app) 的顶部,然后将这一行放在依赖项中

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

你可以通过菜单找到android插件版本

File > Project Structure > Project

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

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

【讨论】:

【参考方案10】:

kotlin 中的配置数据绑定

build.gradle(文件夹应用)

apply plugin: 'kotlin-kapt'

android 
   ...
   dataBinding 
      enabled = true
   


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

享受 Kotlin...

【讨论】:

应用插件:'kotlin-kapt' 在 Kotlin 中非常重要。【参考方案11】:

在 androidStudio ver3.1.3 中为我工作

apply plugin: 'kotlin-kapt'

dataBinding 
    enabled = true

【讨论】:

【参考方案12】:

重要更新

你可以在documentation of Android.看到

默认启用3.2版本的新编译器。

所以只需更新您的 Android Studio 到 V3.2 或 newer。并删除所有不必要的配置。

所以只需在应用级别 build.gradle 启用 dataBinding。

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 latest version。 使用kotlin latest version。

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 版本设置见this answer。

gradle-wrapper.properties

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

【讨论】:

我的项目仍在 gradle 3.0.1 版本上,所以这对我不起作用。 您可以更新您的 Android Studio 和 gradle 以获得更高的稳定性。【参考方案13】:

我想分享我自己的经验。在 android studio 中使用 Kotlin 数据绑定就足够了

dataBinding 
    enabled = true

在“同步”之后,“制作项目”非常重要。之后,您的所有对象都可以使用。

【讨论】:

【参考方案14】:

在我的例子中,错误是 Unresolved reference: RegisterationUserBinding 我只是使用了我的布局名称 fragment_registeration_user 就像这样 FragmentRegisterationUserBinding 并在数据绑定布局中使用它并且错误消失了。

【讨论】:

你太棒了!我花了很多时间应用多个建议来解决问题,但在找到这个答案之前无能为力。根据片段布局名称更改绑定可解决此问题。非常感谢。 很高兴它帮助了你【参考方案15】:

在尝试使用 FragmentDetailsBinding 之前,您必须确保将相应的布局(fragment_details.xml)转换为数据绑定布局,方法是将整个布局包装在“”标签父级中,并将所有 xmlns 移动到布局标签,然后构建项目就是这样

【讨论】:

【参考方案16】:

就我而言,我只是忘记在布局文件中添加标题:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

....

【讨论】:

【参考方案17】:

尝试将此添加到您的 gradle.properties

android.databinding.enableV2=true

【讨论】:

【参考方案18】:

就我而言,这解决了我的问题。

我在 app build.gradle 中添加了这个:

buildFeatures 
    dataBinding true
    viewBinding true 

【讨论】:

【参考方案19】:

如果您从documentation 应用了以下内容:

android 
    ...
    buildFeatures 
        dataBinding true
    

在您模块的gradle.properties 中仍然收到此错误消息,可能是因为缺少 XML 数据标签

如果您通过 Android Studio 的 Fragment Gallery 创建了一个ListFragment 尤其是这种情况,人们希望 Android Studio 会自动将绑定适配器的布局文件转换为绑定布局,但它不会它确实看起来像一个错误,从 4.2.2 版开始没有修复!

但这里是修复:

    打开相应的 XML 文件(在我的例子中,编译器一直在抱怨 AlarmItemBinding 缺少引用,所以 XML 将是 alarm_item.xml 右键单击***标签(在我的情况下为&lt;LinearLayout...&gt; 选择Show Context Actions 选择Convert to data binding layout 选择Build -&gt; Clean project 选择Build -&gt; Rebuild project

【讨论】:

【参考方案20】:

在 Gradle 模块文件中添加这个

android 
    ...
    buildFeatures 
        dataBinding true
    

要在 Kotlin 中使用数据绑定,您需要将您的应用配置为使用数据绑定,在 .app 模块的 build.gradle 文件中启用 dataBinding 构建选项,您可以使用以下代码替换您的代码:

import com.example.app.databinding.FragmentDataBdinding

class ProfileFragment : Fragment() 

    private lateint var mBinding: FragmentProfileBinding

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

        return mBinding.getRoot()
    

如需更多帮助,请查看数据绑定文档链接:https://developer.android.com/topic/libraries/data-binding。

【讨论】:

以上是关于Kotlin-android:未解决的参考数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

未解决的参考:Android Studio 4.1.3 中的数据绑定

使用 kotlin 的 recyclerview 中的数据绑定导致问题

如何使用未绑定访问表单解决写入冲突

“kotlin-android”和“org.jetbrains.kotlin.android”是一样的吗?

在 ngOnInit() 中使用数据绑定从本地 JSON 文件读取数据会导致未定义的变量

未绑定表单/文本框的审计跟踪