数据绑定失败 "couldn't make a guess"
Data-Binding fails with "couldn't make a guess"
自从更新到 Android Studio 3.2.0
我面临以下问题:
Execution failed for task ':mobile:dataBindingGenBaseClassesDebug'.
> couldn't make a guess for com.ACME.database.model.Order
也看到了这个 answer,它提示“包名必须以小写字母开头”。
...看起来很像,好像这个 variable
赋值是原因:
<data class=".databinding.OrderFragmentBinding">
<variable name="order" type="com.ACME.database.model.Order"/>
...
</data>
发现:New data binding compiler for binding classes,这不能解释行为的变化。
Q: 这样的分配是否也受该命名约定的影响?我的意思是,是否有任何机会(除了更改大写包名称之外)使数据绑定 v2“猜测”成功?
我更新到 3.2 后发生了同样的事情(迁移前应用程序工作,没有代码更改)...然后这个 "guess" 问题,即使我在包的第一个字母中确实有小写字母名字!
<data>
...
<variable name="rule" type="com.gta.viewmodels.vmRule"/>
...
</data>
所以我"guess"即使你更新了包名你的问题仍然存在(无论如何这是最好的做法,考虑到问题出现 每次 我升级Android工作室!)。
无论如何,我通过在 gradle.properties 中降级 v2 数据绑定来解决(您会收到 "unsupported" 警告,但请忽略它):
android.databinding.enableV2=false
看起来 Android Studio PG 没有很好地测试这个断言 (here):
Data Binding V2 is now enabled by default and is compatible with V1.
gradle.properties
中的这些设置确实启用了 androidx
数据绑定编译器:
android.databinding.enableV2 = false
android.enableExperimentalFeatureDatabinding = true
通过抓取的包可以看出:
Download https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.pom
Download https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.jar
它抱怨:
WARNING: The option setting 'android.databinding.enableV2=false' is experimental and unsupported.
The current default is 'true'
WARNING: The option setting 'android.enableExperimentalFeatureDatabinding=true' is experimental and unsupported.
The current default is 'false'
很可能需要 androidx.fragment.app.Fragment
而不是 android.support.v4.app.Fragment
,以便使用默认的 v2 数据绑定编译器对 Fragment
进行数据绑定。这也只是一个临时解决方案 - 但仍然比恢复到 v1 数据绑定编译器更好。
更新:
因为 com.android.tools.build:gradle:3.5.0
以上解决方法不再有效;必须重构 XML 文件。当不将任何 class=""
属性添加到 <data />
标记中时效果最佳 - 并且还将此标记添加到任何现有的 <layout>
标记中。数据绑定 <include>
标签上的重复 id
也可能会阻止生成(id
必须在 <include>
标签上设置,而不是在包含的布局中)。
遇到了类似的问题。通过以大写字母开头重命名数据 class 解决。
这是因为您的 class 名称或包名称使用了数据绑定。这些 classes(使用数据绑定)必须以大写字母开头,包以小写字母开头。
我遇到这个问题是因为
1.my 视图模型 类 未从 BaseObservable
扩展
- 我的包名以大写字母开头
我遇到了这个错误,它通过将 clickhandler class 名称的首字母更改为大写来解决
我更改了这个:clickHandler
为此:ClickHandler
com.packagename.android.activity.AddAddressActivity.ClickHandler
您将 运行 陷入此错误的情况:
<data>
<variable
name="something"
type=""/>
</data>
空类型或未定义类型
以防万一上述方法不起作用,请检查您引用的 class 类型是否在同一个模块中,或者在 xml 所在模块所依赖的模块中。
在我的例子中,它只是类型变量 XML 文件中的一个错误路径
<data>
<variable
name="clickListener"
type="com.example.liberdade.caixa.CaixaListener" />
我的情况是我使用 class 小写字母的名称 (propertyModel) 应该是 (PropertyModel)
如果您的包首字母大写改为小写即可解决问题。
自从更新到 Android Studio 3.2.0
我面临以下问题:
Execution failed for task ':mobile:dataBindingGenBaseClassesDebug'.
> couldn't make a guess for com.ACME.database.model.Order
也看到了这个 answer,它提示“包名必须以小写字母开头”。
...看起来很像,好像这个 variable
赋值是原因:
<data class=".databinding.OrderFragmentBinding">
<variable name="order" type="com.ACME.database.model.Order"/>
...
</data>
发现:New data binding compiler for binding classes,这不能解释行为的变化。
Q: 这样的分配是否也受该命名约定的影响?我的意思是,是否有任何机会(除了更改大写包名称之外)使数据绑定 v2“猜测”成功?
我更新到 3.2 后发生了同样的事情(迁移前应用程序工作,没有代码更改)...然后这个 "guess" 问题,即使我在包的第一个字母中确实有小写字母名字!
<data>
...
<variable name="rule" type="com.gta.viewmodels.vmRule"/>
...
</data>
所以我"guess"即使你更新了包名你的问题仍然存在(无论如何这是最好的做法,考虑到问题出现 每次 我升级Android工作室!)。
无论如何,我通过在 gradle.properties 中降级 v2 数据绑定来解决(您会收到 "unsupported" 警告,但请忽略它):
android.databinding.enableV2=false
看起来 Android Studio PG 没有很好地测试这个断言 (here):
Data Binding V2 is now enabled by default and is compatible with V1.
gradle.properties
中的这些设置确实启用了 androidx
数据绑定编译器:
android.databinding.enableV2 = false
android.enableExperimentalFeatureDatabinding = true
通过抓取的包可以看出:
Download https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.pom
Download https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.jar
它抱怨:
WARNING: The option setting 'android.databinding.enableV2=false' is experimental and unsupported.
The current default is 'true'
WARNING: The option setting 'android.enableExperimentalFeatureDatabinding=true' is experimental and unsupported.
The current default is 'false'
很可能需要 androidx.fragment.app.Fragment
而不是 android.support.v4.app.Fragment
,以便使用默认的 v2 数据绑定编译器对 Fragment
进行数据绑定。这也只是一个临时解决方案 - 但仍然比恢复到 v1 数据绑定编译器更好。
更新:
因为 com.android.tools.build:gradle:3.5.0
以上解决方法不再有效;必须重构 XML 文件。当不将任何 class=""
属性添加到 <data />
标记中时效果最佳 - 并且还将此标记添加到任何现有的 <layout>
标记中。数据绑定 <include>
标签上的重复 id
也可能会阻止生成(id
必须在 <include>
标签上设置,而不是在包含的布局中)。
遇到了类似的问题。通过以大写字母开头重命名数据 class 解决。
这是因为您的 class 名称或包名称使用了数据绑定。这些 classes(使用数据绑定)必须以大写字母开头,包以小写字母开头。
我遇到这个问题是因为 1.my 视图模型 类 未从 BaseObservable
扩展- 我的包名以大写字母开头
我遇到了这个错误,它通过将 clickhandler class 名称的首字母更改为大写来解决 我更改了这个:clickHandler 为此:ClickHandler com.packagename.android.activity.AddAddressActivity.ClickHandler
您将 运行 陷入此错误的情况:
<data>
<variable
name="something"
type=""/>
</data>
空类型或未定义类型
以防万一上述方法不起作用,请检查您引用的 class 类型是否在同一个模块中,或者在 xml 所在模块所依赖的模块中。
在我的例子中,它只是类型变量 XML 文件中的一个错误路径
<data>
<variable
name="clickListener"
type="com.example.liberdade.caixa.CaixaListener" />
我的情况是我使用 class 小写字母的名称 (propertyModel) 应该是 (PropertyModel)
如果您的包首字母大写改为小写即可解决问题。