在 android 中使用数据绑定时出错

Error using databinding in android

我正在尝试按照指南 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_heightlayout_width 分配给线性布局的行上。

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

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

那我错过了什么?

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

apply plugin: 'com.android.databinding'

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

此外,您不应将 layout_w/h 添加到 layout 标签,这只是一个 Android Studio 错误,已在 aosp 中修复。

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

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

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

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

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

确保仔细检查

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

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

一般是因为你的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

根据指南 (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 中包含数据绑定部分:

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

错误

error: package my.package.name.databinding does not exists

可能会因为 xml 和 POJO class

之间的不匹配而发生

如果您不创建 getter setter,您必须非常小心,您的 POJO class 数据成员应该是 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;
   }
}

如果你制作gettersetter,javaBean风格class

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

在我的例子中,问题是我将 layout_heightlayout_width 添加到 layout 标签以及我的根布局。我刚刚从 layout 标签中删除了两个属性并解决了问题。

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

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

但我的模型 class 是这样的:

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

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

用户 class 变量声明为非 public。所以我们应该将 POJO class 变量声明为 public.

public class User {


    public String firstName,lastName;

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

然后解决了我的问题。

如果您正在为 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'

//这是在activity_main下 xml .

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

// 这是学生 Class

public class Student {

public 字符串名字; public 字符串姓氏;

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

}

}