Класс привязки данных не создан
Я использую привязку данных в моем проекте, когда использую <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 тегом макета, вам следует перестроить приложение. Если это не помогло, удалите папку сборки и сделайте это снова.
Благодаря этому ответу здесь - похоже, что "пространство имен макета" необходимо либо очистить, либо вам нужно новое уникальное имя.
Вот варианты, которые работали для меня:
Создайте новое имя для макета, чтобы убедиться, что оно может быть сгенерировано. Это решило мою проблему, когда у меня был макет, который был впервые создан, без привязки данных - давайте назовем это
fragment_abc.xml
, Когда я попытался добавить привязку данных, он не был распознан - даже после нескольких вызовов очистки и перезапуска. Однако, как только я сделал копию макетаfragment_abc2.xml
Я сразу же получил сгенерированный объект привязки данных.java/.class.Посмотрев вышеописанную работу, я попытался просто удалить папку /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
}
...
}
В моем случае, я думал, что сгенерированный класс должен появиться с моими обычными классами в 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-файл, попробуйте изменить его, например: просто добавьте пробел. Ваша ошибка будет устранена.