Ответ 1
удаление apply plugin: 'com.neenbedankt.android-apt'
из моего build.gradle решило мою проблему.
Я пытаюсь проверить привязку данных, как указано в руководстве здесь. Я включил это в свой файл 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
не существует.
Выполнение кода отлично работает в моем фрагменте, где я пытаюсь использовать этот макет.
Так что я пропустил?
удаление apply plugin: 'com.neenbedankt.android-apt'
из моего build.gradle решило мою проблему.
Ваши привязки в файле xml могут быть недействительными.
Обязательно дважды проверьте
type
действительной ссылкой на объект данных? type="my.package.Class"
name="client"
→ "@{client.field}"
public
или инкапсулированные с помощью геттеровOldNameBinding -> NewNameBinding
обычно, потому что в вашем файле макета 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
Это, похоже, проблема в студии Android. Редактор будет отмечать его как ошибку, однако он все равно будет компилироваться.
У меня была такая же проблема, и поэтому я клонировал этот пример repo, чтобы проверить, что моя система настроена правильно для поддержки привязки данных api https://github.com/mgrzechocinski/android-bindings-example
Игнорировать предупреждение об ошибке в теге layout
. Это неправильно.
Что-то, что я заметил, вам необязательно требуется тег data
, если просто используют привязку данных, чтобы получить доступ к элементам представлений через генерируемый класс BindingActivity.
Если вы используете плагин "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'
В соответствии с текущей версией руководства (2015-11-11) вам просто нужно добавить две зависимости: В файле build.gradle проекта добавьте зависимость gradle. В настоящее время самая последняя версия - 1.5.0-beta3
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0-beta3'
}
И в файле build.gradle модуля включается раздел DataBinding:
android{
...
dataBinding {
enabled = true
}
...
}
Ошибка
error: пакет my.package.name.databinding не существует
может возникать, потому что несоответствие между xml и классом POJO
Вы должны быть очень осторожны, чтобы члены данных класса POJO были public
, если вы не создаете сеттеры getter.
Если у вас есть простой POJO без какого-либо getter или setter
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Если вы создаете геттер-сеттер, класс стиля 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_height
и layout_width
к тегу layout
, а также к макету корня. Я только что удалил оба атрибута из тега 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'
}
//Это находится в файле 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;
}
}
Похоже, вы забыли добавить плагин привязки данных к файлу приложения gradle:
apply plugin: 'com.android.databinding'
Вы должны применить его к любому модулю, который вы хотите использовать привязку данных.
Кроме того, вы не должны добавлять layout_w/h в тег layout
, это просто ошибка Android Studio, уже зафиксированная в aosp.
Я тоже страдаю той же проблемой. Но моя ошибка
Переменные пользовательского класса, объявленные как не общедоступные. Поэтому мы должны объявить переменные класса POJO общедоступными.
public class User {
public String firstName,lastName;
public User(String fname,String lname){
this.firstName=fname;
this.lastName=lname;
}
}
Тогда я решил свою проблему.