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

在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

我正在尝试测试指南中给出的数据绑定。 我已将其包含在我的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" 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封装
  • java和xml文件中的字段名是否匹配,请检查拼写错误
  • 如果已重命名xml文件,请确保还更新了绑定对象<代码>旧名称绑定->新名称绑定
  • 清洁工程

  • 从我的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
    classxml
    type
    属性中的包参考吗
    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;
    
    }