我正在尝试测试指南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中完美运行,我试图使用这种布局。
那我错过了什么?
答案 0 :(得分:19)
xml文件中的绑定可能无效。
请务必仔细检查
type
属性是否有效引用数据对象? type="my.package.Class"
name="client"
- &gt; "@{client.field}"
public
或使用getters封装OldNameBinding -> NewNameBinding
答案 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_height
和layout_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;
}
}
然后解决了我的问题。