2015-06-12 2 views
32

Я пытаюсь проверить привязку данных, как указано в руководстве here. я включил это в моем build.gradle файл (модуль приложения):Ошибка использования привязки данных в android

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 не существует.

Выполнение кода отлично работает в моем фрагменте, где я пытаюсь использовать этот макет.

Так что же я пропустил?

+0

Вы можете оставить свой 'user' класс POJO и' Activity' класс –

+0

ссылка Двойная проверка пакетов в XML 'type' атрибута. 'my.package.User' или' com.example.User' – Tapirboy

+0

Я столкнулся с этой ошибкой и, наконец, обнаружил, что это связано с тем, что у меня было дублируемое пространство имен xroid. Библиотека DataBinding в Android Studio плохо реагирует на то, чтобы сообщить вам, где сейчас проблема. Надеемся, что следующее обновление прояснит ситуацию. – Amagi82

ответ

17

удаления apply plugin: 'com.neenbedankt.android-apt' из моего build.gradle решить мою проблему.

+2

То же самое, я считаю, что привязка данных уже использует apt внутри. Если вы используете кинжал или любую другую зависимую от приложения библиотеку, используйте только «com.google.dagger: dagger-compiler: 2.0.1» вместо apt «com.google.dagger: dagger-compiler: 2.0.1» – feresr

+10

для меня проблема была «classpath» com.neenbedankt.gradle.plugins: android-apt: 1.4'' обновление до версии 1.8 разрешило проблему – miv

+1

, если кто-то заботится, вы можете быть готовы, почему @miv имеет правильный ответ здесь: https: // bitbucket.org/hvisser/android-apt/issues/38/android-apt-breaks-brand-new-data-binding – tir38

-1

Похоже, вы забыли добавить привязку данных плагина Gradle файл вашего приложения:

apply plugin: 'com.android.databinding'

Вы должны применить его к любому модулю вы хотите использовать привязку данных.

Кроме того, вы не должны добавлять layout_w/h в тег layout, это всего лишь ошибка Android Studio, уже зафиксированная в aosp.

+0

Это не обязательно решение. У меня есть 'apply plugin: 'com.android.databinding', и я все еще получаю эту ошибку. –

+0

Вы используете Android-apt? – yigit

+0

Где именно следует использовать 'apt' в отношении привязки данных? –

1

Это, похоже, проблема в студии android. Редактор будет отмечать его как ошибку, однако он все равно будет компилироваться.

Я была такая же проблема, и поэтому я клонировать этот пример репо, чтобы проверить мою систему настроен правильно поддерживать Databinding апи https://github.com/mgrzechocinski/android-bindings-example

Игнорируйте предупреждение об ошибке на layout теге. Это неверно.

Что-то, что я заметил, вам необязательно требуется тег data, если вы просто используете привязку данных, чтобы получить доступ к элементам вида через генерируемый класс BindingActivity.

+0

Вам не нужен тег' data' ?? В этой статье говорится об обратном! https://developer.android.com/tools/data-binding/guide.html –

+1

Тег данных не нужен, если вы хотите использовать только функцию BindingActivity, которая создается плагином. Ie MainActivityBinding.myview –

+0

@Alec Ему нужен тег данных, так как он явно собирается использовать метод setUser() для сгенерированного класса и автоматически устанавливать данные в макете. Кроме того, вы можете использовать тег данных для установки сгенерированного имени класса, то есть '', а затем сгенерированный класс будет UserData, а не LayoutNameBinding. Чтобы сказать, что ему НЕ НУЖНО, тег данных игнорирует его использование и то, что вы получаете, используя его. – LukeWaggoner

19

Ваши привязки в файле xml могут быть недействительными.

Убедитесь перепроверить

  1. ли type атрибутов действительной ссылки на объект данных? type="my.package.Class"
  2. Имеются ли обязательные условия? name="client" ->"@{client.field}"
  3. Доступны ли поля данных?public или инкапсулировать с добытчиками
  4. ли имена полей в Java и сопоставления файлов XML, проверьте наличие опечаток
  5. Если вы переименовали файл XML, убедитесь, что вы также обновить Binding объекты. OldNameBinding -> NewNameBinding
  6. Clean Project
+1

Недавно я переименовал пакет и Android Studio продолжал искать «com.oldpackage.app.databinding ..», несмотря на очистку проекта. Однако перезапуск A.Studio сделал трюк. – Tapirboy

+1

Отличный контрольный список, спасибо, работал для меня (некорректная привязка слева после копирования-вставки из сети) –

+1

Между 3 и 4 я бы добавил «Проверить наличие опечаток и несоответствий в именах полей/получателей и именах, используемых в XML». Это было для меня. Неверный был выделен серым цветом как неиспользуемый в java-файле. – WindRider

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 
+1

После поиска какое-то время я нашел этот пост. Я, наконец, прокомментировал большую часть моего XML-файла, а затем ошибка исчезла. Оттуда я смог отладить проблему, которая была на самом деле в моем xml (который я не видел в выводе компилятора) и вызывал ошибку для * «Не удалось найти пакет привязки данных» *. Благодаря! – gnB

0

Согласно current version гида (2015-11-11) вы просто должны добавить две зависимости: В файле сборки. gradle проекта добавляет зависимость gradle. В настоящее время самая последняя version 1.5.0-бета3

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

И в файле build.gradle модуля включают в себя раздел Databinding:

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

Ошибка

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

может ocurr, поскольку несоответствие между xml и классом POJO

0

Yo u должен быть очень осторожным, чтобы ваши члены данных класса 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; 
    } 
} 

Если вы геттер сеттер, бина стиль класса

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; 
    } 
} 
0

В моем случае проблема в том, что я добавлял layout_height и layout_width в тег layout, а также на мой корневой макет. Я только что удалил оба атрибута из тега layout и решил проблему.

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' 
} 
-1

Я также страдаю с той же проблемой. Но моя ошибка

Переменные пользовательского класса, объявленные как не общедоступные. Поэтому мы должны объявить переменные класса POJO общедоступными.

public class User { 


    public String firstName,lastName; 

     public User(String fname,String lname){ 
      this.firstName=fname; 
      this.lastName=lname; 
     } 
    } 

Тогда решена моя проблема.

1

Если вы используете плагин «android-apt» для кинжала или других библиотек, после включения привязки данных вам нужно удалить плагин «android-apt» и использовать «предоставленные» вместо «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' 
0

// Это под activity_main xml.

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

// Это студент класса

public class Student { 

общественности Строка Firstname; public String lastname;

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

} 

}

Смежные вопросы