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_version
是com.android.tools.build:gradle
在application 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
右键单击***标签(在我的情况下为<LinearLayout...>
选择Show Context Actions
选择Convert to data binding layout
选择Build -> Clean project
选择Build -> 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”是一样的吗?