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

时间:2015-06-12 05:11:18

标签: android android-fragments data-binding

我正在尝试测试指南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 attributelayout_height的行上layout_width

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

代码完成在我的Fragment中完美运行,我试图使用这种布局。

那我错过了什么?

12 个答案:

答案 0 :(得分:19)

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

请务必仔细检查

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

答案 1 :(得分:17)

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

答案 2 :(得分:3)

通常是因为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

答案 3 :(得分:1)

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

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

忽略layout标记上的错误警告。这是错误的。

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

答案 4 :(得分:1)

如果你正在使用&#39; android-apt&#39; dagger或其他库的插件,启用数据绑定后,你必须删除&#39; android-apt&#39;插件和使用&#39;提供&#39;而不是&#39; apt&#39;在您的依赖项中。例如,如果您使用的是匕首,请删除此

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'

答案 5 :(得分:0)

根据指南的current version(2015-11-11),您只需要添加两个依赖项: 在项目的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类之间的不匹配而出现错误

答案 6 :(得分:0)

如果你没有创建getter setter,你必须非常小心你的POJO类数据成员应该是public

如果您有简单的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;
   }
}

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

...
<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'
}

答案 9 :(得分:0)

//这是在activity_main xml。

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

//这是学生班

public class Student {

public String firstname; public String lastname;

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

}

}

答案 10 :(得分:-1)

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

apply plugin: 'com.android.databinding'

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

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

答案 11 :(得分:-1)

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

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

public class User {


    public String firstName,lastName;

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

然后解决了我的问题。