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

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

Например, у меня есть активность_основной.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

38 ответов

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

Советы по уменьшению застрявшего времени в DataBinding

Обновить

Чтобы получить более точные ошибки и предложения, я настоятельно рекомендую обновить версию 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> Make project).

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

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

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

  • Закрыть проект из Файл> Закрыть проект
  • Открыть снова из недавних

Обратите внимание, что я предпочитаю Close и Open from Recent, потому что это занимает гораздо меньше времени, чем Rebuild / Restart 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 & Restart.

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

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

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

но,

dataBinding {
        enabled = true
    }

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

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

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

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

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

dataBinding {
        enabled = true
    }

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

android.databinding.enableV2=true

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

После правильной настройки (включая пространство имен xml и завертывание всего в <layout>), тот, который работал для меня, делал проект Build -> Make. Ни Clean Project, ни Rebuild Project не сделали этого. Я в Android Studio 2.3.1, использую инструменты сборки 26.0.2. Там нет необходимости для <data> теги.

Мое решение заключалось в том, чтобы использовать суффикс FragmentBinding в имени класса.

Для каждого файла макета создается класс привязки. По умолчанию имя класса основывается на имени файла макета, преобразуя его в регистр Паскаля и добавляя к нему суффикс Binding. Указанное выше имя файла макета - activity_main.xml, поэтому соответствующий сгенерированный класс - ActivityMainBinding. Этот класс содержит все привязки от свойств макета (например, пользовательской переменной) к представлениям макета и знает, как присваивать значения для выражений привязки.

Номенклатура имени класса активности или фрагмента может варьироваться в зависимости от префиксов. Потому что суффикс всегда Binding.

После выполнения реакции Khemraj и Invalidate кэширует / Restart, вы должны переписать ActivityBinding или FragmentBinding, чтобы получить IDE предложения классов, которые уже были сгенерированы и НЕ жёстко импорт.

В моем случае я пытался импортировать имя класса в обратном направлении. FragmentCompetitionsBinding вместо того CompetitionsFragmentBinding.

GL

Источник

У меня такая же проблема. Я сделал ошибку при рефакторинге. Класс автогенерации привязки получил свое имя из файла макета xml.

fragment_name.xml -> FragmentNameBinding

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

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

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

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

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

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

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

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

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

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

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBindingинстед из:

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

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

dataBinding {
    enabled true
}

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

android {
  ......

  dataBinding {
    enabled true
  }
}

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

Если ответ не помог, то моя рекомендация проста, но эффективна.

Идея состоит в том, чтобы определить, какой компонент вызывает проблему. Для этого прокомментируйте все строки вашего custom_fragment.xmlи его использование в CustomFragment.kt и оставим что-нибудь минималистичное, вроде следующего.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</layout>

Затем запустите приложение и добавьте компонент в компонент, пока вы Apply Code Changes (Ctrl+Alt+F10) для выполнения приложения до тех пор, пока приложение не выйдет из строя, то есть когда вы обнаружили ошибку.

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

GL

Убедитесь, что привязка данных включена

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

Дан нажмите кнопку (Синхронизировать проект с Gradle)

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

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

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

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

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

Если есть проблема с вашим XML-файлом, класс Databinding не будет создан. Быстрое исправление - просмотреть XML-файл и проверить синтаксические ошибки (которые обычно выделяются красным). Ошибки могут быть в виде несуществующих или неправильных ссылок, типографских ошибок и т. Д.

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

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

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

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

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

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

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

и в XML:

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

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

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

И в вашем TextView:

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

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

Неразрешенная ссылка: activity_main

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

импорт android.R

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

Я столкнулся с аналогичной проблемой, когда DataBinding не удалось создать класс BindingImpl. В моем случае проблема возникла из-за метода в классе данных, где имя было использовано неправильно: модель содержала метод onSignInCliked(), а в макете, который я использовал, onSigninCliked(). Обратите внимание на вход в систему и вход в систему.

Сообщения об ошибке было недостаточно, и я обнаружил проблему только тогда, когда использовал сценарий сборки с параметром трассировки стека.

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

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

import com.yourpackagename.BR;

в

import androidx.databinding.library.baseAdapters.BR;

Через 2 дня Google наконец получил свое решение, и в моем случае это помогает. Надеюсь, это поможет и сэкономит ваше время. Если это работает для вас, пожалуйста, проголосуйте за это решение.

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

В моем случае классы привязки данных не были созданы, потому что я удалил каталог ресурсов Android mipmap. Я воссоздал каталог res/mipmap/, и классы привязки данных были восстановлены.

В студии Android есть ошибка: если вы попытаетесь переместить действие/фрагмент, вы можете столкнуться с этой проблемой.

Простой хак для решения этой проблемы:

Откройте свой XML-файл, попробуйте изменить его, например: просто добавьте пробел. Ваша ошибка будет устранена.

Другие вопросы по тегам