【问题标题】:Data-Binding fails with "couldn't make a guess"数据绑定因“无法猜测”而失败
【发布时间】:2018-09-24 23:13:49
【问题描述】:

自从更新到 Android Studio 3.2.0 我面临以下问题:

任务“:mobile:dataBindingGenBaseClassesDebug”执行失败。

> 无法猜测 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,它没有解释行为的变化。

:这样的分配是否也受到该命名约定的影响?我的意思是,是否有机会(除了更改大写包名)使数据绑定 v2 “猜测”成功?

【问题讨论】:

    标签: android android-gradle-plugin android-databinding androidx android-studio-3.2


    【解决方案1】:

    这是因为你的类名或包名使用了数据绑定。这些类(使用数据绑定)必须以大写字母开头,包以小写字母开头。

    【讨论】:

    • 这个答案对我有用,但问题是:有没有办法让包以大写字母开头?
    【解决方案2】:

    遇到了类似的问题。通过以大写字母开头重命名数据类来解决。

    【讨论】:

    • 非常漂亮的家伙。你让我哭了..谢谢
    • 同样,我已经解决了重命名为首字母大写的问题:-(
    • 我在将包的首字母命名为大写字母时也犯了同样的错误,现在我将其重构为首字母 small 修复了问题
    【解决方案3】:

    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,以便将Fragment 与默认的v2 数据绑定编译器进行数据绑定。这也只是一个临时解决方案 - 但仍然比恢复到 v1 数据绑定编译器要好。


    更新

    由于com.android.tools.build:gradle:3.5.0 上述解决方法不再起作用;必须重构 XML 文件。在不将任何class="" 属性添加到&lt;data /&gt; 标记中并且将此标记添加到任何现有&lt;layout&gt; 标记中时,它的效果最佳。在数据绑定的&lt;include&gt; 标签上重复id 也可能会阻止生成(id 必须在&lt;include&gt; 标签上设置,而不是在包含的布局中)。

    【讨论】:

      【解决方案4】:

      您会遇到此错误的情况:

      <data>
          <variable
              name="something"
              type=""/>
      </data>
      

      空类型或未定义类型

      【讨论】:

        【解决方案5】:

        更新到 3.2 后发生同样的事情(迁移前的工作应用程序,并且没有代码更改)......然后这个“猜测”问题即使我在包名称的第一个字母中有小写字母!

        <data>
           ...
           <variable name="rule" type="com.gta.viewmodels.vmRule"/>
           ...
        </data>
        

        所以我“猜想”即使您更新了软件包名称,您的问题仍然存在(无论如何这是最佳做法,因为每次升级 Android Studio 时都会出现问题!)。

        无论如何,我通过降级 gradle.properties 中的 v2 数据绑定解决了(您会收到“不支持”警告,但请忽略它):

        android.databinding.enableV2=false
        

        看起来 Android Studio PG 没有很好地测试这个断言 (here):

        Data Binding V2 is now enabled by default and is compatible with V1.

        【讨论】:

        • 感谢您的输入,但找到了更好的临时解决方案。可能会重构为androidx,因为我怀疑过时的support-v4 库,它提供了Fragment 类。
        • 很好的答案!今天我还升级了 AS 3.2,并面临同样的问题,非法参数异常“无法猜测”。谢谢@gtrevi。
        • @Dhiren 我的回答延伸至此。虽然禁用数据绑定 v2 不是答案,但这隐藏了问题(我也可以恢复到构建工具3.1.4,效果完全相同)。如果它是答案,我会接受它,而不是添加另一个。
        • 我绝对同意我的不是一个解决方案,而是一个快速的解决方法(正如 Martin 建议的另一个扩展),只是为了破坏另一个“敢于”升级此 IDE 的构建制动更改。两者都应该在适应新事物的同时暂时使用,而不是大爆炸式重构或工具回归(因此在我看来,变化越少越好)。真正的问题是 Android Studio PG,它声称“Data Binding V2 现在默认启用并与 V1 兼容”,但事实并非如此,因为您需要更改代码!
        • @MartinZeitler 您使用的是过时的support-v4,但我不是,我正在使用所有新的东西,但通过更新 AS 3.2 仍然“无法猜测”。正如您所说的禁用数据绑定 v2 不是答案,而是隐藏了问题,请告诉我正确的解决方案是什么? @gtrevi 如果它的快速解决方法或临时解决方案,让我知道我能做些什么来摆脱这个警告? WARNING: The option setting 'android.databinding.enableV2=false' is experimental and unsupported.
        【解决方案6】:

        我遇到这个问题是因为 1.我的viewmodel类没有从BaseObservable扩展

        1. 我的包名以大写字母开头

        【讨论】:

        • 大写包名称的任何解决方法?
        【解决方案7】:

        我遇到了这个错误,它通过将 clickhandler 类名的第一个字母更改为大写来解决 我改变了这个:clickHandler 对此:ClickHandler com.packagename.android.activity.AddAddressActivity.ClickHandler

        【讨论】:

          【解决方案8】:

          万一上述方法都不起作用,请检查您引用的类类型是否在同一个模块中,或者在 xml 所在模块所依赖的模块中。

          【讨论】:

          • 依赖树是关键。谢谢
          【解决方案9】:

          在我的情况下,这只是类型变量 XML 文件中的错误路径

          <data>
                  <variable
                      name="clickListener"
                      type="com.example.liberdade.caixa.CaixaListener" />
          

          【讨论】:

            【解决方案10】:

            我在我的情况下使用小字母(propertyModel)的类名应该是(PropertyModel)

            【讨论】:

              【解决方案11】:

              如果您的包以大写字母开头,将其更改为小即可解决问题。

              【讨论】:

              猜你喜欢
              • 2020-06-07
              • 2014-05-08
              • 2018-09-06
              • 2019-06-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-20
              相关资源
              最近更新 更多