【问题标题】:Error using databinding in android在android中使用数据绑定时出错
【发布时间】:2015-08-28 00:39:46
【问题描述】:

我正在尝试按照指南 here 中的说明测试数据绑定。 我已将其包含在我的 build.gradle 文件(模块应用程序)中:

compileSdkVersion 'android-MNC'
buildToolsVersion '23.0.0 rc2'

在项目 build.gradle 文件中,我已将其包含在我的依赖项中:

classpath "com.android.tools.build:gradle:1.3.0-beta2"
classpath "com.android.databinding:dataBinder:1.0-rc0"

布局文件与指南中给出的完全相同。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
   <variable name="user" type="com.example.User"/>
</data>
<LinearLayout
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@{user.firstName}"/>
   <TextView android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@{user.lastName}"/>
</LinearLayout>
</layout>

最初它给出了错误Element layout does not have the required attribute layout_width and layout_height。

我试图通过将 match_parent 分配给两者来修复它。然后我得到了错误 Error parsing XML: duplicate attribute 在我将 layout_height 和 layout_width 分配给线性布局的行上。

我再次尝试通过删除这些属性来解决此问题。现在每次我尝试编译时,我都会看到这个-error: package my.package.name.databinding 不存在。

代码完成在我尝试使用此布局的片段中完美运行。

那么我错过了什么?

【问题讨论】:

  • 你能发布你的user POJO 类和Activity 类
  • 在 xml type 属性中仔细检查包引用。 my.package.User 或 com.example.User
  • 我遇到了这个错误,最后发现这是因为我有一个重复的 android xml 命名空间。 Android Studio 中的 DataBinding 库让你知道问题出在哪里实在是太糟糕了。希望下一次更新能够解决问题。
  • 您也可以查看this教程供您参考。

标签: android android-fragments data-binding


【解决方案1】:

// 这是在activity_main xml下。

  <data>
  <variable
      name="student"
      type="com.example.vishalkamboj.testdatabinding.Student"    />
</data>

//这是学生课

public class Student {

公共字符串名字; 公共字符串姓氏;

public Student(String firstname , String lastname)
{
    this.firstname = firstname;
    this.lastname = lastname;

}

}

【讨论】:

    【解决方案2】:

    如果您在 dagger 或其他库中使用 'android-apt' 插件,在启用数据绑定后,您必须删除 'android-apt' 插件并在依赖项中使用 'provided' 而不是 'apt'。例如,如果您使用的是匕首,请将其删除

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    

    还有这个

    apply plugin: 'com.neenbedankt.android-apt' 
    

    然后替换

    apt 'com.google.dagger:dagger-compiler:2.0'
    

    与

    provided 'com.google.dagger:dagger-compiler:2.0'
    

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题。但我的错误是

      声明为非公共的用户类变量。所以我们应该将 POJO 类变量声明为 public。

      public class User {
      
      
          public String firstName,lastName;
      
              public User(String fname,String lname){
                  this.firstName=fname;
                  this.lastName=lname;
              }
          }
      

      然后解决了我的问题。

      【讨论】:

        【解决方案4】:

        您的模型和布局文件之间可能存在问题或不匹配。就我而言,我有:

        ...
        <TextView
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_toLeftOf="@+id/photo"
                    android:layout_toStartOf="@+id/photo"
                    tools:text="0912454433"
                    android:textStyle="bold"
                    android:text="@{contact.cellPhoneNumber}"
                    android:layout_below="@+id/name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
        

        但我的模型课是这样的:

        public class MyContact {
            public String name;
            public String cellphoneNumber; // <-- Notice the lowercase 'p'
        }
        

        【讨论】:

          【解决方案5】:

          您在 xml 文件中的绑定可能无效。

          请务必仔细检查

          1. type 属性对数据对象的引用是否有效? type="my.package.Class"
          2. 绑定有效吗? name="client" -> "@{client.field}"
          3. 数据字段是否可访问? public 或用 getter 封装
          4. java中的字段名和xml文件是否匹配,检查是否有错别字
          5. 如果您重命名了 xml 文件,请确保您还更新了 Binding 对象。 OldNameBinding -&gt; NewNameBinding
          6. 清理项目

          【讨论】:

          • 我最近重命名了一个包,尽管清理了项目,但 Android Studio 一直在寻找“com.oldpackage.app.databinding..”。不过,重启 A.Studio 就成功了。
          • 完美的清单,谢谢,为我工作(从网上复制粘贴后留下不正确的装订)
          • 在 3 和 4 之间,我将添加“检查字段/getter 名称和 XML 中使用的名称中的拼写错误和不匹配”。我就是这样。不正确的在 java 文件中显示为未使用。
          • 事后看来很明显,但要让databinding 包可以访问BaseObservable/Data 类,字段/设置器必须是public。
          • 一个 XML 布局文件中的单个错误可能会导致在包中使用数据绑定的所有 XML 布局文件出现相同的错误,即使所有其他布局文件都完美无缺。
          【解决方案6】:

          就我而言,问题在于我将layout_height 和layout_width 添加到layout 标记以及我的根布局中。我刚刚从layout 标记中删除了这两个属性并解决了问题。

          【讨论】:

            【解决方案7】:

            如果您不创建 getter setter,则必须非常小心,您的 POJO 类数据成员应为 public。

            如果你有没有任何 getter 或 setter 的简单 POJO

            public class User {
               public final String firstName;
               public final String lastName;
               public User(String firstName, String lastName) {
                   this.firstName = firstName;
                   this.lastName = lastName;
               }
            }
            

            如果你让getter setter,javaBean风格类

            public class User {
               private final String firstName;
               private final String lastName;
               public User(String firstName, String lastName) {
                   this.firstName = firstName;
                   this.lastName = lastName;
               }
               public String getFirstName() {
                   return this.firstName;
               }
               public String getLastName() {
                   return this.lastName;
               }
            }
            

            【讨论】:

              【解决方案8】:

              根据指南(2015-11-11)的current version,您只需添加两个依赖项: 在项目的 build.gradle 文件中添加 gradle 依赖。目前最新的version是1.5.0-beta3

              dependencies {
                      classpath 'com.android.tools.build:gradle:1.5.0-beta3'
                  }
              

              并且在模块的 build.gradle 文件中包含 dataBinding 部分:

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

              错误

              错误:包 my.package.name.databinding 不存在

              可能因为 xml 和 POJO 类不匹配而发生

              【讨论】:

                【解决方案9】:

                这通常是因为您的 XML 布局文件中存在错误,无法生成绑定对象。确保你写的数据类型正确,检查你写的下限或上限。

                    <data>
                        <variable name="yourObject" type="com.example.simple.YourObject"/>
                    </data>
                

                并确保对象正确调用:

                    <TextView android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@{yourObject.name}"/>
                    <TextView
                

                【讨论】:

                • 找了一阵子,找到了这个帖子。我终于注释掉了我的大部分 XML 文件,然后错误就消失了。从那里,我能够调试实际上在我的 xml 中的问题(我在编译器输出中没有看到),并导致 “找不到数据绑定包” 的错误.谢谢!
                【解决方案10】:

                从我的 build.gradle 中删除 apply plugin: 'com.neenbedankt.android-apt' 解决了我的问题。

                【讨论】:

                • 这里也一样,我相信数据绑定已经在内部使用了 apt 。如果您使用 dagger 或任何其他依赖于 apt 的库,只需使用提供的“com.google.dagger:dagger-compiler:2.0.1”而不是 apt“com.google.dagger:dagger-compiler:2.0.1”
                • 对我来说问题是 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 升级到 1.8 解决了问题
                • 如果有人关心,您可以在这里准备好为什么@miv 有正确答案:bitbucket.org/hvisser/android-apt/issues/38/…
                • 在删除这个 apt 东西后,我在 butterknife @BindView`` 中得到了 NPA
                • @sakirk 你能帮我解决这个问题吗:stackoverflow.com/q/39837222/6599627
                【解决方案11】:

                这似乎是 android studio 中的一个问题。编辑器会将其标记为错误,但仍会编译。

                我遇到了同样的问题,所以我克隆了这个示例 repo 来测试我的系统是否配置正确以支持数据绑定 api https://github.com/mgrzechocinski/android-bindings-example

                忽略layout 标签上的错误警告。错了。

                我注意到,如果只是使用数据绑定通过生成的 BindingActivity 类访问视图项,则不一定需要 data 标记。

                【讨论】:

                • 你不需要data标签??本文另有说法! developer.android.com/tools/data-binding/guide.html
                • 如果您只想利用插件生成的BindingActivity,则不需要数据标签。即 MainActivityBinding.myview
                • @Alec 他确实需要数据标签,因为他显然会在生成的类上使用 setUser() 方法并自动在布局中设置数据。此外,您可以使用数据标签设置生成的类名称,即&lt;data name="UserData"&gt;&lt;/data&gt;,然后生成的类将是 UserData 而不是 LayoutNameBinding。说他不需要数据标签忽略了它的用途以及您通过使用它获得的收益。
                【解决方案12】:

                您好像忘记将数据绑定插件添加到应用的 gradle 文件中:

                apply plugin: 'com.android.databinding'

                你必须将它应用到你想使用数据绑定的任何模块。

                另外,你不应该将 layout_w/h 添加到 layout 标签,它只是一个 Android Studio 错误,已经在 aosp 中修复。

                【讨论】:

                • 这不一定是解决方案。我有apply plugin: 'com.android.databinding,但仍然收到此错误。
                • 你使用的是Android-apt吗?
                • 在数据绑定方面我应该在哪里使用apt?
                • apply plugin: 'com.android.databinding' 不再需要
                猜你喜欢
                • 2015-09-11
                • 2019-06-04
                • 2019-06-15
                • 1970-01-01
                • 1970-01-01
                • 2020-07-07
                • 1970-01-01
                • 2019-09-29
                • 1970-01-01
                相关资源
                最近更新 更多