Подтвердить что ты не робот

Ошибка использования привязки данных в android

Я пытаюсь проверить привязку данных, как указано в руководстве здесь. Я включил это в свой файл 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 не существует.

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Обязательно дважды проверьте

  • Являются ли атрибуты type действительной ссылкой на объект данных? type="my.package.Class"
  • Действительно ли привязка действительна? name="client""@{client.field}"
  • Доступны ли поля данных? public или инкапсулированные с помощью геттеров
  • Являются именами полей в java и сопоставлении файлов xml, проверяют опечатки
  • Если вы переименовали файл xml, убедитесь, что вы также обновили объекты Binding. OldNameBinding -> NewNameBinding
  • Очистить проект

Ответ 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

Ответ 4

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

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

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

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

Ответ 5

Если вы используете плагин "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'

Ответ 6

В соответствии с текущей версией руководства (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

Ответ 7

Вы должны быть очень осторожны, чтобы члены данных класса 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;
   }
}

Ответ 8

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

Ответ 9

У вас может быть проблема или несоответствие между вашей моделью и вашим файлом макета. В моем случае у меня было:

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

Ответ 10

//Это находится в файле 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;

}

}

Ответ 11

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

apply plugin: 'com.android.databinding'

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

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

Ответ 12

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

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

public class User {


    public String firstName,lastName;

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

Тогда я решил свою проблему.