Я использую привязку данных в своем проекте, когда я использую <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
dataBinding.enabled
в вашем build.gradle?ActivityMainBinding
, или он должен что-то делать с этой ошибкой.<variable>
в xml<variable>
, он генерирует класс привязки без создания проекта.Ответы:
Я не получил удовлетворительных ответов. Итак, вот советы, которые обобщают мои знания о привязке данных.
Советы по решению проблем с привязкой данных
Обновить
Чтобы получать более точные ошибки и предложения , я настоятельно рекомендую обновить версию плагина 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. Автоматически сгенерированное имя класса привязки?
Ваш класс привязки данных должен быть сгенерирован после создания макета привязки.
4. Не видите предложения по импорту?
Иногда , когда вы печатаете
ActivityMai...
, то это не показывает предложение , в этом случае импорт вручную .import <yourpackage>databinding.ActivityMainBinding;
5. Прочтите журнал ошибок сборки.
Ваш класс привязки и новые переменные в макете не будут созданы, если ваша сборка не удалась. Итак, сначала создайте проект с помощью Ctrl + F9 (Сборка> Создать проект) .
6. Закройте и откройте проект из недавнего
Я всегда так делаю, потому что это занимает гораздо меньше времени, чем
Rebuild
/Make
project.Обратите внимание, что я предпочитаю Close и Open from Recent, потому что это занимает гораздо меньше времени, чем Rebuild / Restart IDE .
7. Восстановить проект
Если по-прежнему ваш класс не сгенерирован. (Иногда, когда мы вставляем файл макета, это происходит). Затем перестройте проект из
Build> Rebuild
(а не сборку или создание проекта ). Он сгенерирует ваш класс привязки данных. ( Rebuild делает за меня Magic. )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
в своем макете и тип установщика геттера не меняется, тогда Clean project (Build> Clean Project
)Заключительные слова
Наконец, если ваш класс привязки по-прежнему не сгенерирован, значит, у нас есть самое мощное оружие. - Перезагрузите Android Studio: D
Это все, что я делаю для решения моих ошибок привязки данных. Если у вас возникнут дополнительные проблемы, вы можете прокомментировать здесь.
источник
Класс DataBinding создается автоматически.
если ваше имя xml - activity_test, тогда класс привязки будет ActivityTestBinding.
но,
dataBinding { enabled = true }
макет должен иметь макет как корневой
<layout xmlns:android="http://schemas.android.com/apk/res/android"> </layout>
источник
ConstraintLayout
как root. Спасибо!Я была такая же проблема. После прочтения документации 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 + ВОЙТИ :)
источник
После правильной настройки (включая пространство имен xml и упаковку всего в него
<layout>
), тот, который работал у меня, выполнял Build -> Make project. Ни Clean Project, ни Rebuild Project не сделали. Я в Android Studio 2.3.1, использую инструменты сборки 26.0.2.<data>
Теги не нужны .источник
если вы выполняете базовую работу, для включения базы данных в своем проекте, например, используйте enable в gradle и используйте тег макета в xml , когда вы меняете xml-код и не генерируете новый класс привязки данных для этих xml, вы можете использовать быстрый способ для генерации только данных класс привязки в gradle-> other-> databindinggenbaseclasses Отлаживайте его быстрее, чем весь проект. он генерирует только класс привязки данных.
источник
dataBinding { enabled = true }
Чтобы включить новый компилятор привязки данных, добавьте в файл gradle.properties следующую опцию:
android.databinding.enableV2=true
источник
Классы привязки данных генерируются во время сборки, поэтому после того, как вы включите привязку данных в сборке Gradle приложения и окружите свой xml тегом макета, вы должны перестроить свое приложение. Если это не помогает, удалите папку сборки и повторите попытку.
источник
Не знаю, подойдет он вам или нет. Просто переименуйте XML-файл макета. Например, предположим, что ваше имя макета - activity_main.xml, просто измените его, переименуйте на что-нибудь вроде main.xml и снова переименуйте его в activity_main.xml . Затем вы сможете увидеть параметр импорта в ActivityMainBinding .
Надеюсь, это сработает для вас.
источник
Благодаря этому ответу здесь - похоже, что «пространство имен макета» нужно либо очистить, либо вам нужно новое уникальное имя.
Вот варианты, которые у меня сработали:
Создайте новое имя для макета, чтобы его можно было сгенерировать. Это решило мою проблему, когда у меня был первый созданный макет без привязки данных - назовем его
fragment_abc.xml
. Когда я попытался добавить к нему привязку данных, он не был распознан - даже после нескольких вызовов очистки кеша и перезапуска. Однако как только я сделал копию макетаfragment_abc2.xml
, сразу же получил сгенерированный объект привязки данных .java / .class.Увидев вышеуказанную работу, я попытался просто удалить папку / build из модуля и перестроить проект - это помогло получить привязку данных для исходного макета.
источник
Единственное, что я могу представить, если это возможно, - это если у вас нет
dataBinding { enabled true }
в вашем файле gradle. Если не просто добавить его в файл gradle. т.е.
android { ...... dataBinding { enabled true } }
затем синхронизируйте свой проект. Если это все еще не удается, вам может потребоваться сделать недействительную / перезапустить вашу студию Android.
источник
<variable>
в xml он создает классdataBinding
привязки , поэтому нет случая не добавлять в файл gradle, если я не добавил, то он не должен создавать класс привязки.Когда вы работаете с многомодульным Android-приложением, проверьте свой путь к классу привязки. Возможно, вам стоит использовать:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
insted из:import com.yourcompany.app.android.databinding.FragmentABCtBinding
источник
Удалите макеты и отмените их и убедитесь, что сгенерированные классы привязки после этого правильно импортированы.
источник
Мое решение заключалось в том, чтобы использовать суффикс FragmentBinding в имени класса.
Номенклатура имени класса активности или фрагмента может варьироваться в зависимости от префиксов. Потому что суффикс всегда Binding.
После выполнения реакции Khemraj и Invalidate кэширует / Restart , вы должны переписать ActivityBinding или FragmentBinding , чтобы получить IDE предложения классов , которые уже были сгенерированы и НЕ жёстко импорт.
В моем случае я пытался импортировать имя класса в обратном порядке
FragmentCompetitionsBinding
вместоCompetitionsFragmentBinding
.GL
Источник
источник
Если ответ не помог вам, то моя рекомендация проста, но эффективна.
Идея состоит в том, чтобы определить, какой компонент является причиной проблемы. Для этого прокомментируйте все строки вашего
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
источник
У меня была такая же проблема. Вы все сделали правильно. Дело в том, что вам нужно добавить переменную внутри тега данных в xml. Для этого вы должны создать образец класса модели и добавить его как переменную в теге данных.
До этого вы не увидите сгенерированного ActivityMainBinding.
источник
У меня была аналогичная проблема, когда у меня был обернут макет и включена привязка данных в файле gradle. Основная деятельность по-прежнему не может быть intellisense или видеть мои классы. Для меня это исправило добавление переменной привязки и импорт привязки в любом случае. Оттуда я просто построил решение, а потом, похоже, он узнал, что это за класс. Оттуда я смог импортировать свои созданные классы случаев верблюда.
источник
У меня возникла проблема, и проблема заключалась в макете, используемое поле не было строкой, это была дата.
Похоже, что для работы все поля должны быть текстовыми, по крайней мере, с компонентом TexView.
Если вы строите с помощью команды ./gradlew build --stacktrace
Это лучше показывает ошибки.
источник
В моем случае я думал, что сгенерированный класс должен появиться вместе с моими обычными классами в
src
папке. Вдобавок я подумал, что имя сгенерированного класса должно немного отличаться. Все это было моей ошибкой. Сгенерированный класс можно найти вbuild
папке поbuild -> generated -> ...
пути. Если в вашей деятельности нет импорта сгенерированного класса, добавьте импортimport com.yourcompany.app.databinding.ActivityMainBinding;"
источник
Если вы получаете следующую ошибку в DataBindingUtil.setContentView
все, что вам нужно сделать, это удалить следующий оператор импорта
Я нашел решение на другом форуме. Источник
источник
Если недавно какой-либо из существующих проектов перенесен в androidx, вам необходимо заменить импорт из
import com.yourpackagename.BR;
к
import androidx.databinding.library.baseAdapters.BR;
Через 2 дня Google наконец получил решение, которое работает для меня.
источник
your.project.package.BR
). Не внутри сторонней библиотеки, напримерandroidx.databinding.library.baseAdapters.BR
.Бывают случаи, когда вы не видите файл в сгенерированном каталоге, возможно, вы привязываете свойство, которое не объявлено в viewmodel. По сути, это не дает вам ошибки lint, если вы делаете это в xml.
источник
Если вы реализуете Serializable ->, вы должны реализовать Serializable
иначе вы получите эту ошибку. Надеюсь, это поможет кому-то в будущем
В моем случае я использую библиотеку Parcel. Я пропустил аннотирование @Parcel в моем подклассе
источник
В дополнение к вышеуказанным шагам вы также можете проверить тип переменной. Убедитесь, что это 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)}"
источник
В моем случае классы привязки данных не были созданы, потому что я удалил каталог ресурсов Android mipmap. Я воссоздал каталог res / mipmap /, и классы привязки данных были восстановлены.
источник
Я столкнулся с аналогичной проблемой, когда DataBinding не удалось создать класс BindingImpl . В моем случае проблема была связана с методом в классе данных, где имя было использовано неправильно: модель содержала метод onSignInCliked (), а в макете, который я использовал, onSigninCliked () . Обратите внимание на вход в систему и вход в систему .
Сообщения об ошибке было недостаточно, и я обнаружил проблему только тогда, когда использовал сценарий сборки с параметром трассировки стека.
источник
Убедитесь, что привязка данных включена
Дан нажмите кнопку (Синхронизировать проект с Gradle)
источник
Если есть проблема с вашим XML-файлом, класс Databinding не будет создан. Быстрое исправление - просмотреть XML-файл и проверить синтаксические ошибки (которые обычно выделяются красным). Ошибки могут быть в виде несуществующих или неправильных ссылок, типографских ошибок и т. Д.
По сути, просто убедитесь, что в вашем XML-коде нет красной подчеркнутой строки. Когда вы закончите, перестройте, и ваш класс привязки данных будет создан.
источник
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.
источник
используйте путь к классу 'com.android.databinding: dataBinder: 1.0-rc0'
источник