Клас прив’язки даних не сформований


97

Я використовую прив'язку даних у своєму проекті, коли використання <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
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
є dataBinding.enabledу вашому build.gradle?
pskink

2
Я думаю, що це відома помилка. Ви можете спробувати створити свій проект, перш ніж спробувати отримати доступ ActivityMainBinding, або він повинен щось робити з цією помилкою.
yennsarah

@pskink так, це, саме тому він генерує клас прив'язки після додавання <variable>в xml
Раві

@Amylinn після побудови мого проекту, який він генерує, але моє питання полягає в тому, що коли я пишу <variable>, він генерує клас прив'язки без побудови проекту.
Раві

ах, справді, я це пропустив
pskink

Відповіді:


216

Я не отримав жодної задовільної відповіді. Отже, ось поради, які є підсумком моїх знань щодо прив’язки даних.

Поради щодо вирішення проблем, пов’язаних із прив’язкою даних

Оновлення

Щоб отримати точніші помилки та пропозиції , настійно рекомендую оновити версію плагіна Android Studio та Gradle до останньої. Тому що я не стикаюся з багатьма проблемами після версії AS 3.2.

Дивіться останню версію Android Studio та останній плагін Gradle .

Orignal Solution

Прочитавши цю відповідь, ви не застрягнете в проблемах автоматичного генерації прив'язки даних як для класів, так і для змінних даних .

Перевірте ці пункти по одному. Будь-яке з них може зробити вашу роботу готовою. Останній пункт 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. Прочитайте Logcat збою побудови

Клас прив'язки та нові змінні в макеті не будуть генеровані, якщо збірка не вдається. Отже, спочатку створіть проект за допомогою Ctrl + F9 (Build> Make project) .

  • Якщо збірка не вдається, подивіться, що таке помилка, як правило, ми маємо помилки в полях макета. Журнали помилок вказуватимуть номер рядка помилки з проблемою.
  • Зв'язування може НЕ в змозі викликати деяку дурну помилку , як помилку синтаксису чи відсутнього імпорт. У цьому випадку ви отримаєте logcat, повний помилок класів прив'язки. Але вам слід прочитати повний журнал, щоб знайти відповідну проблему .

6. Закрити та відкрити проект із недавнього

Я завжди роблю це, тому що це займає набагато менше часу, ніж Rebuild/ Makeпроект.

  • Закрити проект у меню Файл> Закрити проект
  • Відкрити знову з недавнього

Зауважте, що я віддаю перевагу режиму « Закрити та відкрити» з « Останніх», оскільки це займає набагато менше часу, ніж відновлення / перезапуск 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у вашому макеті, а тип сеттера getter не змінюється, тоді очистіть проект ( Build> Clean Project)

Заключні слова

Нарешті, якщо ваш клас прив'язки все ще не сформований, ми маємо найпотужнішу зброю. - Перезапустіть Android Studio: D

  • По-перше, спробуйте просто перезапустити , це завжди генерує змінні мого макета прив'язки після перезапуску.
  • Якщо це не працює, вимкніть кеш і перезапустіть .

Це все, що я роблю для вирішення помилок прив’язки даних. Якщо у вас виникнуть додаткові проблеми, ви можете залишити коментар тут.


2
Якщо проблема не зникне ... (8) Вимкнути та перезапустити .... якщо не вирішено, (9) змінити dataBinding {enabled = false} ... build, а потім dataBinding {enabled = true} побудувати знову ....
PravyNandas


1
У моєму випадку мені довелося імпортувати шлях до класу вручну з якихось причин IDE не відображає це як рішення. Tnx :)
Іван Калоянов

2
Врятував мій день. Мені не вистачало обгортки <layout> у файлі макета. Дякую!
Джуліано,

Ви також можете додати, що "import android.R" потрібно видалити, якщо це частина списку імпорту. Це вирішило мою проблему з невирішеним посиланням на файл xml активності
Тім Джон

23

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

якщо ваше ім'я xml має значення action_test, то класом Binding буде ActivityTestBinding.

але,

dataBinding {
        enabled = true
    }

макет повинен мати макет як root

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

Я годинками шукаю душу, роблю магію градле багато, але використовую ConstraintLayoutяк корінь. Дякую!
Олексій Марков

14

У мене була та сама проблема. Після ознайомлення з документами 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> 

10

У моєму випадку клас Binding був згенерований і на місці (але я думав, що ні) ... але він не додає автоматично імпорт зазначеного класу до розділу імпорту діяльності / фрагменту ... так що ... OPTION + ENTER :)


2
Бінго, працював у мене, хоча мені доводилося вводити імпорт вручну, intellisense не пропонував цю опцію з будь-якої причини.
Роб

8

Після правильного налаштування (включаючи простір імен xml та обертання всього <layout>), той, що працював для мене, робив Build -> Make project. Ані «Чистий проект», ані «Проект відновлення» не зробили. Я перебуваю в Android Studio 2.3.1, використовуючи засоби збірки 26.0.2. У <data>тегах немає потреби .


Це слід позначити як правильну відповідь. Усі інші - це лише обхідні шляхи. Не потрібно переміщувати простори імен або навіть додавати елемент даних
Вікі Кападія,

8

якщо ви виконуєте базову роботу, для того, щоб увімкнути прив'язку даних у своєму проекті, наприклад, використовуйте enable у gradle та використовуйте тег макета в xml , коли ви змінюєте xml-код і не створили новий клас прив'язки даних для цих xml, ви можете скористатися швидким способом для створення лише даних клас прив'язки у gradle-> інше-> databindinggenbaseclassesПеревірка його швидше, ніж повний цілий проект. його генерує лише клас прив'язки даних. введіть тут опис зображення


4
dataBinding {
        enabled = true
    }

Щоб увімкнути новий компілятор прив'язки даних, додайте наступний параметр у файл gradle.properties:

android.databinding.enableV2=true

3

Класи прив'язки даних генеруються під час збірки, тому після того, як ви ввімкнете прив'язку даних у збірці Gradle програми та оточите ваш xml тегом макета, вам слід відновити вашу програму. Якщо це не допомогло, видаліть папку збірки та повторіть це знову.


2

Завдяки цій відповіді тут - схоже, "простір імен макета" потрібно або очистити, або вам потрібно нове унікальне ім'я.

Ось варіанти, які працювали у мене:

  1. Створіть нову назву для макета, щоб переконатися, що його можна створити. Це вирішило мою проблему, коли я мав макет, який був створений вперше, без прив’язки даних - назвемо це fragment_abc.xml. Коли я намагався додати до нього прив'язку даних, вона не була розпізнана - навіть після кількох викликів кешу та перезапуску. Однак, як тільки я зробив копію макета fragment_abc2.xml, відразу ж отримав згенерований об'єкт прив'язки даних .java / .class.

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


1

Єдине, що я можу уявити, якщо це можливо, це якщо у вас цього немає

dataBinding {
    enabled true
}

у вашому файлі gradle. Якщо не просто додати його у файл gradle. тобто

android {
  ......

  dataBinding {
    enabled true
  }
}

потім синхронізуйте свій проект. Якщо це все одно не вдається, можливо, вам доведеться зробити недійсним / перезавантажити свою студію Android


Я чітко зазначив у своєму питанні, що після додавання <variable>у xml він генерує клас Binding, тому немає жодного випадку не додавання dataBindingу файл gradle, якщо я не додав, то він не повинен генерувати клас прив'язки.
Раві

Перед синхронізацією та перезапуском. Будь ласка, спробуйте "Зробити". Це буде тренування.
Nizamudeen Sherif

1

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

Сподіваюся, це працює для вас.


1

Під час роботи з мультимодульною програмою для Android перевіряйте шлях до класу прив’язки. Можливо, вам слід використовувати:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding покладено на:

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


1

Видаліть макети та скасуйте та переконайтесь, що згенеровані класи прив’язки після цього правильно імпортовані.


0

У мене була така сама проблема. Все, що ви зробили правильно. Справа в тому, що вам потрібно додати змінну всередині тегу даних у xml. Для цього вам слід створити зразок класу моделі та додати його як змінну в тег даних.

До цього ви не зможете побачити згенерований ActivityMainBinding.


0

У мене була подібна проблема, коли у мене був загорнутий макет і моє прив’язування даних увімкнено у файлі gradle. Основна діяльність все ще не могла бути інтелісенсною або бачити мої заняття. Для мене це виправлено - це додавання змінної прив’язки та імпорт прив’язки в будь-якому випадку. Звідти я просто побудував рішення, і тоді, здавалося, знав, що це за клас. Звідти я зміг імпортувати свої генеровані класи справи верблюдів.


0

Я отримав проблему, і проблема полягала в макеті, використовуване поле не було рядком, а датою.

Виглядає, що все поле повинно бути текстом, щоб працювати, принаймні з компонентом TexView.

Якщо ви будуєте за допомогою команди ./gradlew build --stacktrace

Це краще показує помилки.


0

У моєму випадку я думав, що згенерований клас повинен з'являтися разом із моїми звичайними класами в srcпапці. Крім того, я вважав, що назва сформованого класу має дещо відрізнятися. Все це була моя помилка. Створений клас можна знайти в buildпапці, build -> generated -> ...шляху. Якщо у вашій діяльності немає імпорту згенерованого класу, додайте імпорт

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

0

Якщо ви отримаєте таку помилку в DataBindingUtil.setContentView

Невирішене посилання: Activity_main

все, що вам потрібно зробити, це видалити наступну заяву про імпорт

імпорт android.R

Я знайшов рішення на іншому форумі. Джерело


0

Якщо нещодавно який-небудь мігрував існуючий проект в androidx, вам потрібно замінити імпорт із

import com.yourpackagename.BR;

до

import androidx.databinding.library.baseAdapters.BR;

Після Google 2 дні нарешті отримали рішення, яке для мене працює.


1
Ні. Зв’язуючий ресурс ( .BR. ), Як ресурс ( .R. ). Він згенерований на основі вашого ресурсу проекту (ідентифікатор, малювальний, кольоровий, ...), тому розміститься у вашому проектному пакеті ( your.project.package.BR). Не всередині сторонньої бібліотеки, як androidx.databinding.library.baseAdapters.BR.
dphans

0

Бувають випадки, коли ви не побачите файл у створеному каталозі, можливо, ви пов’язуєте властивість, яка не оголошена в viewmodel. По суті, це не призводить до помилок, якщо ви робите це в xml.


0

Якщо ви реалізуєте серіалізувальний -> ви мусите реалізувати серіалізований

в іншому випадку ви отримаєте цю помилку. Сподіваюся, це допоможе комусь у майбутньому

У моєму випадку я використовую бібліотеку посилок. Я пропустив анотацію @Parcel у своєму підкласі


0

На додаток до вищевказаних кроків, ви також можете перевірити тип змінної. Переконайтеся, що це 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)}"

0

Моє рішення було взяти за суфікс FragmentBinding в назві класу.

Клас прив'язки створюється для кожного файлу макета. За замовчуванням ім'я класу базується на назві файлу макета, перетворюючи його на регістр Pascal і додаючи до нього суфікс Binding. Вище наведене ім'я файлу макета має ім'я Activity_main.xml, тому відповідним згенерованим класом є ActivityMainBinding. Цей клас містить усі прив'язки від властивостей макета (наприклад, користувацької змінної) до подань макета і знає, як призначати значення для виразів прив'язки.

Номенклатура назви діяльності або класу фрагментів може відрізнятися щодо префіксів. Оскільки суфікс завжди є Зв’язуючим.

Після відповіді Khemraj та Invalidate Caches / Restart , вам слід переписати ActivityBinding або FragmentBinding щоб отримати пропозиції IDE для класів, які вже були створені, і НЕ імпорту.

У моєму випадку я намагався імпортувати назву класу назад FragmentCompetitionsBindingзамість be CompetitionsFragmentBinding.

GL

Джерело


0

У моєму випадку класи прив'язки даних не створювалися, оскільки я видалив каталог ресурсів Android mipmap. Я відтворив каталог res / mipmap /, і класи прив'язки даних були відновлені.


0

Я зіткнувся з подібною проблемою, коли DataBinding не вдалося створити клас BindingImpl . У моєму випадку виникла проблема з методом у класі даних, де ім'я було використано неправильно: модель містила метод onSignInCliked () та в макеті, який я використовував onSigninCliked () . Зверніть увагу на SignIn проти Signin .

Повідомлення про помилку було недостатньо, і я виявив проблему лише тоді, коли використав сценарій збірки з опцією стека-трасування.


0

Переконайтеся, що прив’язка даних увімкнена

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

Синхронізуйте проект з gradle і натисніть кнопку (синхронізувати проект з Gradle)


0

Якщо з вашим файлом XML виникає проблема, клас прив'язки даних не буде генерується. Швидким виправленням буде запуск файлу XML і перевірка синтаксичних помилок (які зазвичай виділяються червоним кольором). Помилки можуть мати форму неіснуючих або помилкових посилань, друкарських помилок тощо.

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


-1

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.

3
Чому в загальному випадку для DataBinding потрібен дозвіл в Інтернеті?
M.Pomeroy

1
@ M.Pomeroy так, це не потрібно, відповідь не відредаговано дякую
Рохан Лодхі

-5

використовувати шлях до класу 'com.android.databinding: dataBinder: 1.0-rc0'


для gradle 1.5.0 і вище, не потрібно використовувати цей шлях до класу.
Раві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.