Kotlin-android: 未解决的引用数据绑定

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

我的顶级 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 tools version 23.0.1,Android SDK 23,SDK tools 24.4.0

90562 次浏览

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

它与1.0-rc4一起工作,放

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

进入你的依赖

感谢 Ghedeon 在评论中的链接

更新 : 给你一个非常简单的 hello world 示例项目

试试这个。安德烈工作室2.0(2.1)

建造,分级

android{
dataBinding {
enabled = true
}
...
}
dependencies {
kapt 'com.android.databinding:compiler:2.0.0-rc1'
....
}


kapt {
generateStubs = true
}

在我的项目: buildToolsVersion = "23.0.3"

顶级建筑,等级

dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
}

尝试使用以下配置:

主要内容:

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

应用程序 建造,分级:

android {
dataBinding {
enabled = true
}
}


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


kapt {
generateStubs = true
}

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

首先检查插件是否应用:

apply plugin: 'kotlin-kapt'

那么

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

您可能在依赖关系中出错:

使用

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

而不是

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

您可以访问 给你了解新版本

谢谢你。

并且在使用其绑定类之前在布局文件中使用布局标记,您可以很容易地做到: 在布局文件中,根视图(例如-Constraint Layout) ALT + E nter-> 转换为数据绑定类

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

渐变版本是

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

这里是一个示例链接,以完成数据绑定库在 kotlin 中的使用。

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

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

下面的步骤

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

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

——启用第二个 dataBinding true

**dataBinding {
enabled = true
}**

所有这些都是在 app.build.gradle 中添加的 在点击“ SYNC NOW”之后

例如,你有编辑配置文件的活动,然后如何定义绑定变量在 kotlin? ?

lateinit var buildProfileBinding: ActivityBuildProfileBinding


buildProfileBinding = getBinding()

这里,getbindingis 方法处理哪种类型的绑定对象

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

对我来说,加上

kapt {
generateStubs = true
}

帮我解决了问题,我第一次忽略了,我以为这和问题无关:

未解决的引用数据绑定

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

在你的 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_versionapplication build.gradlecom.android.tools.build:gradle的版本

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

机器人{ ///现行守则 { GenerateStubs = true } }

要解决这个问题,你必须把

apply plugin: 'kotlin-kapt'

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

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

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

File > Project Structure > Project

然后再次同步。如果你看到这个警告,忽略它。

第三方的 Gradle 插件可能是原因

Kotlin 中的配置数据绑定

Gradle (文件夹应用程序)

apply plugin: 'kotlin-kapt'


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


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

好好享受科特林吧。

我在 android Studio ver3.1.3中就可以做到这一点

apply plugin: 'kotlin-kapt'


dataBinding {
enabled = true
}

show usage sample

重要更新资料

你可以在 Android 的文档。中看到

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

因此,只是更新您的 Android Studio 到 V3.2更新。并删除所有不必要的配置。

因此,只需在应用程序级别 build.gradle中启用 dataBinding。

android {
dataBinding {
enabled = true
}
}

它会自动为你做所有的事情。

您可以安全地删除以下行-

  • 删除 < strong > datinding.编译器

    kapt 'com.android.databinding:compiler:3.0.1'
    
  • Remove kapt

    kapt {
    generateStubs = true
    }
    

My complete config

build.gradle (Project)

kotlin_version = '1.2.71'
classpath 'com.android.tools.build:gradle:3.2.0'

使用 最新版本。 使用 Kotlin 最新版本

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"

重点 不要只是复制和粘贴配置。参见 这个答案设置 Kotlin 版本。

梯级包装纸,性能

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

我想分享我自己的经验。在 android 工作室使用数据绑定与 Kotlin 足以添加

dataBinding {
enabled = true
}

在那之后,“同步它”,这是非常重要的,“使项目”。之后,您的所有对象将被激活使用。

在我的情况下,错误是 Unresolved reference: RegisterationUserBinding我只是使用我的布局名称 fragment_registeration_user喜欢这样的 FragmentRegisterationUserBinding,使其在数据绑定布局和错误消失了。

在你尝试使用 FragmentDetailsBinding 之前,你必须确保通过将整个布局包装在“”标签父节点中,并将所有的 xmlns 移动到布局标签中,然后构建项目并完成它,从而将相应的布局转换为数据绑定布局

在我的情况下,我只是忘记在布局文件中添加标题:

<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">


....

试着把这个加到你的 Gradle 房地产公司

android.databinding.enableV2=true

对我来说,这解决了我的问题。

我在 build.gradle 应用程序中添加了以下内容:

buildFeatures {
dataBinding true
viewBinding true
}

在 Gradle 模块文件中添加以下内容

android {
...
buildFeatures {
dataBinding true
}
}

要在 Kotlin 使用数据绑定,您需要将应用程序配置为使用数据绑定,在。应用程序模块,你可以用以下代码替换你的代码:

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

在你的 Gradle 模块(应用程序)文件添加

android {
...
buildFeatures {
dataBinding true
}
}

顺便说一下,请记住: 生成的视图绑定名称是基于您的布局文件的名称,而不是您的类的名称!

这意味着,如果您有 MainActivity类和相应的 activity_main.xml,绑定将被称为 ActivityMainBinding

另外,不要忘记通过添加

binding = ActivityMainBinding.inflate(layoutInflater)

进入你的 onCreate()方法。

别忘了还要补充一点:

setContentView(binding.root)

而不是 setContentView(R.layout.activity_main)(这将导致您的听众根本无法工作)