在 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_height
和 layout_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 文件中的绑定可能无效。
确保仔细检查
type
属性对数据对象的引用是否有效? type="my.package.Class"
- 绑定有效吗?
name="client"
-> "@{client.field}"
- 数据字段是否可访问?
public
或者用 getters 封装
- java 和 xml 文件中的字段名称是否匹配,检查拼写错误
- 如果您重命名了 xml 文件,请确保您也更新了绑定对象。
OldNameBinding -> NewNameBinding
- 清理项目
从我的 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_height
和 layout_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;
}
}
我正在尝试按照指南 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
不存在。
代码完成在我尝试使用此布局的 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 文件中的绑定可能无效。
确保仔细检查
type
属性对数据对象的引用是否有效?type="my.package.Class"
- 绑定有效吗?
name="client"
->"@{client.field}"
- 数据字段是否可访问?
public
或者用 getters 封装 - java 和 xml 文件中的字段名称是否匹配,检查拼写错误
- 如果您重命名了 xml 文件,请确保您也更新了绑定对象。
OldNameBinding -> NewNameBinding
- 清理项目
从我的 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
的简单 POJOpublic 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_height
和 layout_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;
}
}