【问题标题】:Kotlin-android: unresolved reference databindingKotlin-android:未解决的参考数据绑定
【发布时间】: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 是一种更好的初始化方式

标签: java android kotlin android-databinding


【解决方案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'。见stackoverflow.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.2newer。并删除所有不必要的配置。

          所以只需在应用级别 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 版开始没有修复!

                    但这里是修复:

                    1. 打开相应的 XML 文件(在我的例子中,编译器一直在抱怨 AlarmItemBinding 缺少引用,所以 XML 将是 alarm_item.xml
                    2. 右键单击顶级标签(在我的情况下为&lt;LinearLayout...&gt; 选择Show Context Actions
                    3. 选择Convert to data binding layout
                    4. 选择Build -&gt; Clean project
                    5. 选择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

                      【讨论】:

                        猜你喜欢
                        • 2020-12-26
                        • 2020-01-18
                        • 1970-01-01
                        • 2020-09-29
                        • 1970-01-01
                        • 2021-11-02
                        • 2019-10-11
                        • 1970-01-01
                        • 2021-07-23
                        相关资源
                        最近更新 更多