在android中使用数据绑定时出错
我正在尝试测试指南中给出的数据绑定。 我已将其包含在我的build.gradle文件(模块应用程序的)中: 在project build.gradle文件中,我已将其包含在我的依赖项中:在android中使用数据绑定时出错,android,android-fragments,data-binding,Android,Android Fragments,Data Binding,我正在尝试测试指南中给出的数据绑定。 我已将其包含在我的build.gradle文件(模块应用程序的)中: 在project build.gradle文件中,我已将其包含在我的依赖项中: classpath "com.android.tools.build:gradle:1.3.0-beta2" classpath "com.android.databinding:dataBinder:1.0-rc0" 布局文件与指南中给出的布局文件完全相同 <?xml version="1.0" en
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>
最初它给出了一个错误元素布局没有所需的属性layout\u width和layout\u height
我试图通过将match_parent分配给这两个对象来修复它。然后我得到了错误
解析XML时出错:在我为线性布局指定了layout\u height
和layout\u width
的行上重复属性
我再次尝试通过删除这些属性来修复此问题。现在每次尝试编译时,我都会看到这样一个-错误:package my.package.name.databinding
不存在
代码完成在我尝试使用此布局的片段中非常有效
那么我错过了什么呢?看起来你忘了将数据绑定插件添加到应用程序的gradle文件中:
应用插件:“com.android.databinding”
您必须将其应用于任何要使用数据绑定的模块
另外,您不应该在layout
标记中添加layout w/h,这只是一个Android Studio bug,已经在aosp中修复。这似乎是Android Studio中的一个问题。编辑器会将其标记为错误,但仍会编译
我也有同样的问题,所以我克隆了这个示例repo来测试我的系统是否正确配置以支持数据绑定api
忽略布局
标记上的错误警告。这是错误的
我注意到,如果您只是使用数据绑定通过生成的BindingActivity类访问视图项,则不一定需要data
标记 xml文件中的绑定可能无效
一定要仔细检查
type
属性对数据对象的引用有效吗type=“my.package.Class”
绑定是否有效name=“client”
->“@{client.field}”
数据字段是否可访问<代码>公共
或用getter封装
从我的build.gradle中删除
apply插件:“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)的规定,您只需添加两个依赖项:
在项目的build.gradle文件中添加gradle依赖项。目前最新版本是1.5.0-beta3
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0-beta3'
}
在模块的build.gradle文件中包括数据绑定部分:
android{
...
dataBinding {
enabled = true
}
...
}
错误
错误:包my.package.name.databinding不存在
可能是因为xml和POJO类不匹配如果不创建getter setter,您必须非常小心,POJO类数据成员应该是公共的
如果您有没有任何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;
}
}
在我的例子中,问题是我将layout\u height
和layout\u width
添加到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" />
。。。
但我的模型课是这样的:
public class MyContact {
public String name;
public String cellphoneNumber; // <-- Notice the lowercase 'p'
}
公共类MyContact{
公共字符串名称;
公共字符串cellphoneNumber;//我也有同样的问题。但我的错误是
声明为非公共的用户类变量。因此,我们应该将POJO类变量声明为公共的
public class User {
public String firstName,lastName;
public User(String fname,String lname){
this.firstName=fname;
this.lastName=lname;
}
}
然后解决了我的问题。如果您正在为dagger或其他库使用“android apt”插件,在启用数据绑定后,您必须删除“android apt”插件,并在依赖项中使用“提供”而不是“apt”。例如,如果您正在使用dagger,请删除此插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
还有这个
apply plugin: 'com.neenbedankt.android-apt'
然后更换
apt 'com.google.dagger:dagger-compiler:2.0'
与
//这在活动_主xml下
<data>
<variable
name="student"
type="com.example.vishalkamboj.testdatabinding.Student" />
</data>
公共字符串名;
公共字符串lastname
public Student(String firstname , String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
}您可以发布您的user
POJO类和Activity
classxmltype
属性中的包参考吗my.package.User
或com.example.User
我遇到了这个错误,最后发现是因为我有一个重复的android xml命名空间。Android Studio中的数据绑定库在让您知道问题所在方面非常糟糕。希望下一次更新会让事情变得更清楚。你也可以查看教程以供参考。这不一定是解决方案。我有apply插件:'com.android.databinding
,但仍然会遇到这个错误。你在使用安卓apt吗?关于数据绑定,我应该在哪里使用apt
?apply插件:'com.android.databinding'
不再需要你不需要data
标签??这篇文章不是这么说的!如果只想利用插件生成的BindingActivity,则不需要数据标记。Ie MainActivityBinding。myview@Alec他确实需要数据标记,因为他显然要在生成的类上使用setUser()方法,并在布局中自动设置数据。此外,您还可以使用数据标记设置基因
<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;
}