Error using databinding in android

2019-01-23 22:52发布

I am trying to test data binding as given in the guide here. I have included this in my build.gradle file (of module app) :

compileSdkVersion 'android-MNC'
buildToolsVersion '23.0.0 rc2'

In the project build.gradle file, I have included this in my dependencies :

classpath "com.android.tools.build:gradle:1.3.0-beta2"
classpath "com.android.databinding:dataBinder:1.0-rc0"

The layout file is exactly the same as the one given in the guide.

<?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>

Initially it gave an error Element layout does not have the required attribute layout_width and layout_height.

I tried to fix it by assigning match_parent to both. Then I got the error Error parsing XML: duplicate attribute on the lines where i assigned layout_height and layout_width to the linear layout.

Again I tried to fix this by removing these attributes. Now every time I try to compile, I see this- error: package my.package.name.databinding does not exist.

The code completion is working perfectly in my Fragment where I am trying to use this layout.

So what did I miss ?

12条回答
倾城 Initia
2楼-- · 2019-01-23 23:06

removing apply plugin: 'com.neenbedankt.android-apt' from my build.gradle solved my problem.

查看更多
三岁会撩人
3楼-- · 2019-01-23 23:07

According to the current version of the guide (2015-11-11) you just have to add two dependencies: In the file build.gradle of the project add the gradle dependency. Currently the most recent version is 1.5.0-beta3

dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0-beta3'
    }

And in the file build.gradle of the module include the dataBinding section:

android{
  ...
  dataBinding {
        enabled = true
    }
  ...
}

The error

error: package my.package.name.databinding does not exists

may ocurr because a mismatch between the xml and the POJO class

查看更多
SAY GOODBYE
4楼-- · 2019-01-23 23:09

// This is under activity_main xml .

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

// This is Student Class

public class Student {

public String firstname ; public String lastname ;

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

}

}

查看更多
贼婆χ
5楼-- · 2019-01-23 23:12

You may have a problem or mismatch between your model and your layout file. In my case I had:

...
<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" />

but my model class was like so:

public class MyContact {
    public String name;
    public String cellphoneNumber; // <-- Notice the lowercase 'p'
}
查看更多
老娘就宠你
6楼-- · 2019-01-23 23:14

You have to be very careful that your POJO class data members should be public if you are not creating the getter setters.

If you have simple POJO without any getter or setter

public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

If you make getter setter, javaBean style 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;
   }
}
查看更多
▲ chillily
7楼-- · 2019-01-23 23:16

it’s usually because there is an error in your XML layout file and it can’t generate the binding object. Make sure you write data type correctly, check lower or upper of your writing.

    <data>
        <variable name="yourObject" type="com.example.simple.YourObject"/>
    </data>

And make sure object is right calling:

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{yourObject.name}"/>
    <TextView
查看更多
登录 后发表回答