Класс привязки данных не сгенерирован

Я использую привязку данных в своем проекте, когда использование <layout> и <data> в моем классе привязки xml не генерируется.

Например, у меня есть activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

Теперь, если я пишу ActivityMainBinding в своей активности/фрагменте, он показывает ошибку, что класс недоступен. Но после включения <variable> в мой XML файл он может генерировать класс ActivityMainBinding.

Android Studio: 2.1.3
Класс: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Ответы

Ответ 1

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

Советы по решению проблем с привязкой данных

Обновление

Чтобы получить более точные сообщения об ошибках и предложения, я настоятельно рекомендую обновить версию плагина Android Studio и Gradle до последней версии. Потому что я не сталкиваюсь со многими проблемами после версии AS 3.2.

См. Последняя версия Android Studio и Последний плагин Gradle.

Оригинальное решение

Прочитав этот ответ, вы не застрянете в проблемах автоматического создания привязки данных как для классов, так и для переменных данных.

Проверьте эти пункты по одному. Любой из них может сделать вашу работу. Пункт 3 до последнего действительно важен, поэтому не пропустите их.

1. Проверьте, включена ли привязка данных

Вы должны включить привязку данных в build.gradle. Если нет, то добавьте это и Синхронизируйте.

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

2. Проверить макет конвертируется в макет переплета

Теперь, если вы хотите, чтобы был создан класс привязки данных, вам следует обернуть xml layout привязкой данных (тег<layout). Примерно так.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

3. Автоматически сгенерированное имя класса Binding?

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

Если имя вашего макета в случае змеи activity_main.xml, тогда класс привязки данных будет генерироваться в случае верблюда, как ActivityMainBinding.

4. Не видите предложение импорта?

Иногда, когда вы набираете ActivityMai..., тогда не показывает подсказку, в этом случае импортируйте вручную.

import <yourpackage>databinding.ActivityMainBinding;

5. Читать Build Fail Logcat

Ваш класс связывания и новые переменные в макете не будут сгенерированы, если ваша сборка не удалась. Итак, сначала Создать проект с помощью Ctrl + F9 (Build> Создать проект).

  • Если сборка не удалась, посмотрите, что является ошибкой, обычно у нас есть ошибки в полях макета. Журналы ошибок будут указывать номер строки ошибки с проблемой.
  • Привязка может завершиться неудачей и вызвать некоторую глупую ошибку, например синтаксическую ошибку или пропущенный импорт. В этом случае вы получите logcat, полный ошибок связывающих классов. Но вы должны прочитать полный журнал, чтобы найти соответствующую проблему.

6. Закройте и откройте проект из последних

Я всегда так делаю, потому что это занимает гораздо меньше времени, чем проект Rebuild/Make.

  • Закрыть проект из File> Close Project
  • Открыть снова из недавнего

Обратите внимание, что я предпочитаю закрывать и открывать из недавних, потому что это занимает намного меньше времени, чем перестройка/перезапуск IDE.

7. Перестройте проект

Если ваш класс еще не создан. (Некоторое время, когда мы вставляем файл макета, тогда это происходит). Затем Перестройте проект из Build> Rebuild (не "Создать или создать проект"). Это сгенерирует ваш класс привязки данных. (Перестройка делает магию для меня.)

8. Установите последнюю версию Android Studio

После обновления AS до Android Studio 3.2 я почувствовал, что многие ошибки исправлены в автогенерации привязки данных. Таким образом, вы также должны иметь последнюю версию AS.

Решение для <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

Обычно, когда мы помещаем переменную в макет, она создает и получает ее. И мы можем использовать binding.setItem(item); и binding.getItem();, но если вы не видите эти методы, прочитайте приведенную ниже информацию.

1. Закройте и откройте проект из недавнего

Если вы создали переменную данных - <variable в макете, и она не отображает свои установщик и получатель в классе привязки данных, тогда Закрыть и открыть из последних ваш проект.

2. Очистите проект после изменения типа

Если вы изменили тип некоторых <variable в макете и тип установщика геттера не изменится, тогда Очистить проект (Build> Clean Project)

Заключительные слова

Наконец, если ваш класс привязки не сгенерирован, у нас есть самое мощное оружие. - Перезапустите Android Studio: D

  • Сначала попробуйте просто перезапустить, после перезапуска всегда генерируются переменные моего связующего макета.
  • Если это не работает, Invalidate Cache & Перезапустите.

Это все, что я делаю, чтобы решить мои ошибки привязки данных. Если у вас возникнут какие-либо проблемы, вы можете оставить комментарий здесь.

Ответ 2

Класс DataBinding генерируется автоматически.

если ваше имя xml - activity_test, тогда класс Binding будет ActivityTestBinding.

но,

dataBinding {
        enabled = true
    }

макет должен иметь макет как root

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

Ответ 3

Я была такая же проблема. После прочтения файлов android sdk docs существует только ожидаемое имя файла, но ничего не говорится о том, что делать, если этого не происходит. Я заметил после нескольких исследований, что после удаления пространства имен в элемент макета, как показано ниже (с использованием вашего примера), это сработало для меня.

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

Ответ 4

В моем случае класс Binding был сгенерирован и на месте (но я думал, что это не так)... но он автоматически не добавляет импорт указанного класса в раздел импорта активности/фрагмента... так что... OPTION + ВОЙТИ :)

Ответ 5

После правильной настройки (включая пространство имен xml и перенос всего в <layout>), тот, который работал для меня, выполнял Build → Make project. Проект "Чистый проект" или "Реконструкция". Я в Android Studio 2.3.1, используя инструменты сборки 26.0.2. Нет необходимости в тегах <data>.

Ответ 6

если вы выполняете базовую работу, для включения привязки данных в вашем проекте, например, используйте enable в gradle и используете тег layout в xml, когда вы изменяете код xml и не генерируете новый класс привязки данных для этих xml, вы можете использовать быстрый способ генерации только данных класс связывания в gradle-> other-> databindinggenbaseclassesDebug это быстрее, чем просто весь проект. его генерировать только класс привязки данных. enter image description here

Ответ 7

dataBinding {
        enabled = true
    }

Чтобы включить новый компилятор привязки данных, добавьте следующий файл в файл gradle.properties:

android.databinding.enableV2=true

Ответ 8

Классы привязки данных генерируются во время сборки, поэтому после того, как вы включите привязку данных в сборке Gradle приложения и окружите свой XML с тегом макета, вы должны перестроить свое приложение. Если это не помогает, удалите свою папку сборки и сделайте это снова.

Ответ 9

Благодаря этому ответу здесь - похоже, что "пространство имен макетов" нужно либо очистить, либо вам нужно новое уникальное имя.

Вот варианты, которые работали на меня:

  1. Создайте новое имя для макета, чтобы убедиться, что он может быть сгенерирован. Это решило мою проблему, когда у меня был макет, который был сначала создан, без привязки данных - позвольте ему называть его fragment_abc.xml. Когда я попытался добавить привязку данных к нему, он не был распознан - даже после нескольких явных вызовов кеширования и перезапуска. Однако, как только я сделал копию макета fragment_abc2.xml, я сразу же получил сгенерированный объект привязки.java/.class.

  2. После просмотра вышеуказанной работы я попытался просто удалить папку /build из модуля и перестроить проект - это сработало, чтобы получить привязку данных к исходному макету.

Ответ 10

Единственное, что я могу себе представить, если это возможно, - это если у вас нет

dataBinding {
    enabled true
}

в вашем файле gradle. Если не просто добавить его в файл градиента. т.е.

android {
  ......

  dataBinding {
    enabled true
  }
}

затем синхронизируйте свой проект. Если он по-прежнему не работает, вам может потребоваться сделать Invalidate/Restart вашей студии Android

Ответ 11

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

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding insted:

import com.yourcompany.app.android.databinding.FragmentABCtBinding

Ответ 12

Если в последнее время кто-либо перенес существующий проект в androidx, вам нужно заменить импорт из

import com.yourpackagename.BR;

в

import androidx.databinding.library.baseAdapters.BR;

Через 2 дня Google наконец-то получил решение, которое мне помогло.

Ответ 13

У меня была такая же проблема. Все, что вы сделали правильно. Вам нужно добавить переменную внутри тега данных в xml. Для этого вы должны создать образец модельного класса и добавить его как переменную в тег данных.

До тех пор вы не сможете увидеть сгенерированный ActivityMainBinding.

Ответ 14

Я не знаю, что это сработает для вас или нет. Просто переименуйте имя XML файла макета. Предположим, что ваше имя макета - activity_main.xml, просто измените его на что-нибудь вроде main.xml и снова переименуйте его в activity_main.xml. Затем вы можете увидеть опцию импорта в ActivityMainBinding.

Надеюсь, это сработает для вас.

Ответ 15

У меня была похожая проблема, когда у меня был свернутый макет и включена привязка данных в файле Gradle. Основная деятельность до сих пор не мог intellisense или увидеть мои занятия. Для меня это исправило добавление переменной привязки и импорт привязки в любом случае. Оттуда я только что построил решение, и тогда он, казалось, знал, что это был за класс. Оттуда я смог импортировать мои классы дел верблюда, которые были сгенерированы.

Ответ 16

Я получил проблему, и проблема была в макете, используемое поле не было строкой, это была дата.

Похоже, что все поле должно быть текстовым, чтобы работать, по крайней мере, с компонентом TexView.

Если вы строите с помощью команды. /gradlew build --stacktrace

Это лучше показывает ошибки.

Ответ 17

В моем случае я подумал, что сгенерированный класс должен появиться вместе с моими обычными классами в папке src. Кроме того, я подумал, что имя сгенерированного класса должно немного отличаться. Это все было моей ошибкой. Сгенерированный класс можно найти в папке build, путь build -> generated -> .... Если в вашей деятельности нет импорта сгенерированного класса, добавьте импорт

import com.yourcompany.app.databinding.ActivityMainBinding;"

Ответ 18

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

Ответ 19

В случае, если вы получите следующую ошибку в DataBindingUtil.setContentView

Unresolved reference: activity_main

все, что вам нужно сделать, это удалить следующую инструкцию импорта

import android.R

Я нашел решение на другом форуме. Источник

Ответ 20

В некоторых случаях вы не увидите файл в сгенерированном каталоге, возможно, вы привязываете свойство, которое не объявлено в viewmodel. По сути, это не даст вам ошибки, если вы сделаете это в xml.

Ответ 21

Если вы используете Сериализуемый ->, вы должны реализовать Сериализуемый

иначе вы получите эту ошибку. Надеюсь, что это поможет кому-то в будущем

В моем случае я использую библиотеку Parcel. Я пропустил аннотацию @Parcel в моем подклассе

Ответ 22

В дополнение к вышеупомянутым шагам, вы также можете проверить тип переменной. Убедитесь, что это строка для TextView или такая же, как определено в BindingAdapter. Например:

data class MyDataObject(val name: String, val age: Int)

и в XML:

android:text="@{dataobject.age}"

Это вызовет вышеуказанную ошибку. Чтобы исправить это, вы можете либо сделать переменную age типа String, либо импортировать String в свой XML и использовать String.valueOf(age) следующим образом:

<data>
    <import type="String" />
...
</data>

И в вашем TextView:

android:text="@{String.valueOf(dataobject.age)}"

Ответ 23

1. Добавить ниже в приложении Gradle

 dataBinding {
        enabled = true
    }

2. В формате XML напишите код ниже

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

Ответ 24

use class path 'com.android.databinding: dataBinder: 1.0-rc0'