Не удается разрешить класс привязки данных Android

При использовании привязки данных я не могу получить класс MainActivityBinding согласно Руководству по привязке данных < / а>

Имя моего макета activity_main.xml. Я также вижу Android - DataBinding - Как и когда будут сгенерированы классы привязки? но мне это не поможет.


person pRaNaY    schedule 09.03.2016    source источник
comment
Как называется ваша деятельность ??   -  person M D    schedule 09.03.2016
comment
@MD Меня зовут: MainActivity.java   -  person pRaNaY    schedule 09.03.2016
comment
Проект Clean and Built, это снова сгенерирует класс DataBinding, как сказал @RRR   -  person M D    schedule 09.03.2016
comment
Я уже пробовал это, но это не может решить мою проблему!   -  person pRaNaY    schedule 09.03.2016
comment
Любой, кто сталкивается с первоначальной настройкой привязки данных, может попробовать этот code2concept.blogspot. в / 2016/07 /   -  person nitesh    schedule 30.07.2016
comment
Я заметил, что если файл макета xml запускается непосредственно из макета ограничений, он не будет работать. Оберните все в ‹layout›, переместите в него xmlns: android = ..., xmlns: app = ... и xmlns: tools = ..., а затем очистите и перестройте. Должен появиться объект привязки. Также, как говорили другие, убедитесь, что ваше имя правильное.   -  person himura    schedule 19.08.2017
comment
Возможный дубликат класса привязки данных не создан   -  person Khemraj Sharma    schedule 25.10.2018
comment
mobologicplus.com/, пожалуйста проверьте этот учебник   -  person Sunil Kumar    schedule 19.06.2019


Ответы (26)


Класс DataBinding будет создан на основе имени вашего файла xml. Это четко указано в документе, за которым вы следите.

По умолчанию класс Binding создается на основе имени файла макета, преобразуя его в регистр Паскаля и добавляя к нему суффикс «Binding». Вышеупомянутый файл макета был main_activity.xml, поэтому класс генерации был MainActivityBinding

Если ваше имя xml activity_main.xml, то имя класса DataBinding будет ActivityMainBinding.

Если ваше имя xml main_activity.xml, то имя класса DataBinding будет MainActivityBinding.

Не забудьте один раз очистить и собрать проект

вы можете следовать этому руководству, чтобы узнать больше о DataBinding

person Community    schedule 09.03.2016
comment
Я уверен в названии макета, как я уже добавил в свой вопрос. - person pRaNaY; 09.03.2016
comment
да, но в вопросе вы упомянули activity_main.xml и использовали MainActivityBinding, это должно быть ActivityMainBinding - person Rocky; 09.03.2016
comment
Убедитесь, что вы перестроили проект после добавления компонентов xml, чтобы этот класс был сгенерирован. - person Ajith Memana; 11.07.2016
comment
Если у вас возникли проблемы с неразрешенным символом, попробуйте заключить макет в тег <layout>. - person Nexen; 30.09.2017
comment
Всякий раз, когда вы работаете с привязкой, выполните шаги 1: сначала выполните dataBinding {enabled = true} в gradle ..sync it. 2: используйте тег ‹layout› ‹data› ‹/data› ‹/ layout›, если у вас есть модель просмотра, затем примените его в ‹переменной› в вашем теге макета 3: затем перейдите к своему действию и посмотрите там ActivityMainBinding .. если нет, снова перестройте его и убедитесь, что он должен быть там .. Спасибо - person Vishal; 11.05.2018
comment
Большое спасибо. Мучался последний час и пытался набрать MyActivityBinding - это ActivityMyBinding. Спасибо еще раз. - person Pooja; 07.01.2021

ПОПРОБОВАТЬ Переименовать XML-файл на другое имя и проверить, работает ли привязка, когда он заработает, переименуйте его обратно на то, которое использовалось.

Это помогло для Android Studio 3.1

person Ismail Iqbal    schedule 19.04.2018
comment
Это лучше, чем перезапуск IDE - person Geekarist; 25.05.2018
comment
Интересно, что AS даже не переименовал xml файл. Когда я перешел из проводника, класс привязки был обнаружен автоматически. Классический баг! Спасибо за указатель. - person NightFury; 16.08.2018
comment
обалденный человек .. какой отличный ответ. Кто бы мог подумать, переименование исправит это (хммм ... Android studio !!! ..). Я следил за этим по книгам и не работал, но этот трюк исправил его. - person Dilip Agheda; 11.09.2018
comment
Это работает для меня, но у меня много бездельников, другого решения нет? (Android 3.2) - person Gilberto Ibarra; 27.09.2018
comment
@GilbertoIbarra, можешь попробовать перезапустить студию Android? - person Ismail Iqbal; 28.09.2018
comment
Ошибка все еще существует в Android Studio 3.2.1 - person Odys; 17.11.2018

Спасибо всем за ответ. Я нашел решение с именем класса ContentMainBinding для привязки данных. Позвольте мне объяснить.

ПРИМЕЧАНИЕ. При использовании макета с <include ... здесь <include layout="@layout/content_main" имеется функция привязки данных, имя класса связано с включением имени макета. Вот ContentMainBinding

Мой файл макета выглядит следующим образом:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.databindingdemo.app.MainActivity">
    ...
    <include layout="@layout/content_main" />
    ...
    </android.support.design.widget.CoordinatorLayout>

А content_main.xml - это макет, в который я добавил свой код макета привязки данных.

Поэтому вместо использования MainActivityBinding его можно решить с помощью ContentMainBinding

Код, который работает для меня, приведен ниже:

//Code for data binding
    ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
    user = new User("Pranay", "Patel", "[email protected]", "9999999999");
    contentMainBinding.setUser(user);

СДЕЛАНО.

person pRaNaY    schedule 09.03.2016
comment
Вы обманули себя, он установит ваш макет активности content_main.xml, а не activity_main.xml. То, что вы нашли, является способом по умолчанию для прикрепления активности к макету. - person Khemraj Sharma; 27.04.2018
comment
Не следуйте этому ответу. Будет установлен макет content_main. Если вы хотите надуть activity_main.xml, оберните его тегом <layout. и используйте ActivityMainBinding class. - person Khemraj Sharma; 01.08.2018
comment
Спасибо @Khemraj за предложение. Это старый ответ. Может быть ошибка. Не могли бы вы обновить ответ, если можете? - person pRaNaY; 02.08.2018

Убедитесь, что ваш файл activity_main.xml заключен в теги layout, например:

<?xml version="1.0" encoding="utf-8"?>
<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">

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

    </android.support.constraint.ConstraintLayout>
</layout>
person Andrew Lee    schedule 29.03.2019
comment
Просто наличие тега <layout> в любом месте XML решает эту проблему. - person Rami Alloush; 06.04.2020
comment
Это спасает мне день, на самом деле я забываю это сделать - person Sattar; 30.04.2021

Если имя класса DataBinding правильное, и вы использовали для очистки и перекомпоновки проекта, но он по-прежнему показывает ошибку.
Затем вы пытаетесь перезапустить AndroidStudio

person Linh    schedule 02.11.2016

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

Затем я изменил имя своего xml-файла - это отлично сработало.

Итак, я хотел бы поделиться с вами одной вещью, пожалуйста, измените имя файла xml.

Например: если ваш xml файл: activity_main.xml и вы не можете получить ActivityMainBinding в своем классе Java .......... затем измените имя xml на main_activity.xml, а затем используйте MainActivityBinding в своем классе java как 'приватная привязка MainActivityBinding;'

Скорее всего, так и будет.

person Musthafa    schedule 16.05.2018

В таких случаях, если ни перестройка, ни аннулирование кешей не работают, то должна быть ошибка в одном из ваших xml-файлов, где вы могли использовать @ {xyz.abc}, и должна быть проблема с xyz или abc в xml.

person Rohan Taneja    schedule 05.09.2017

В моем случае УДАЛЕНИЕ папки сборки приложения, а затем восстановление проекта решило мою проблему.

Даже следующие шаги не помогли.

          1) Rebuild the project after adding the dataBinding  in gradle.

          2) Rebuild after adding layout tag in xml.

          3) cleaning the project

          4) rebuilding the project

          5) Restarted the Android Studio

После включения привязки данных в файле приложения gradle, пожалуйста, перестройте. Затем мы можем найти сгенерированный класс Binding.

          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
person Thriveni    schedule 03.08.2018
comment
Я также попытался изменить тип генерации привязок со встроенной AS на компилятор и наоборот с перезапуском AS. Ничего не произошло. Вчера все нормально работало - person Herrgott; 02.09.2018
comment
Я трачу один час, чтобы решить эту проблему, затем я попробовал ваше решение. Я меняю имя xml, но оно не работает, затем я перестраиваю, чистый перезапуск, и он работает. Благодарность - person Rucha Bhatt Joshi; 02.02.2019

У меня была такая же проблема после изменения имени пакета моего источника, после того, как я попробовал много вещей (в том числе упомянутых здесь), я решил проблему, импортировав класс привязки данных вручную:

import com.domain.my.databinding.MyActivityBinding;
person hiddeneyes02    schedule 17.08.2018

Обязательно добавьте следующие строки в файл build.gradle

dataBinding {enabled true}

person Revanth Kovuri    schedule 04.08.2019

Убедитесь, что имена xml и класса активности / фрагмента совпадают; например, если у вас есть TimePickerFragment, то имя файла xml должно быть time_picker_fragment.

Мне пришло в голову, что у меня был макет с именем fragment_time_picker; после того, как я его изменил, привязка была сгенерирована.

person AAryz    schedule 19.04.2017

Класс привязки будет создан на основе имени файла макета. По умолчанию имя класса основывается на имени файла макета, преобразовывая его в регистр Паскаля и добавляя к нему суффикс Binding.

например, если ваше имя xml - activity_main.xml, тогда имя класса DataBinding будет ActivityMainBinding.

затем импортируйте пакет:

import com.companyname.applicationname.databinding.ActivityMainBinding;

тогда ты можешь использовать это

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Test", "User");
binding.setUser(user);
person Alen Lee    schedule 06.05.2018

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

person Ankit    schedule 09.03.2016

По умолчанию класс Binding создается на основе имени файла макета, начиная с верхнего регистра, удаляя символы подчеркивания (_) и используя следующую букву с заглавной буквы, а затем добавляя суффикс «Binding».

Этот класс будет помещен в пакет привязки данных под пакетом модуля.

Например, файл макета contact_item.xml сгенерирует ContactItemBinding.

Если пакет модуля com.example.my.app, он будет помещен в com.example.my.app.databinding.

Классы привязки могут быть переименованы или помещены в разные пакеты путем настройки атрибута class элемента данных. Например:

<data class="ContactItem">
    ...
</data>

Это создает класс привязки как ContactItem в пакете привязки данных в пакете модуля. Если класс должен быть сгенерирован в другом пакете внутри пакета модуля, он может иметь префикс “.”:

<data class=".ContactItem">
    ...
</data>

В этом случае ContactItem создается непосредственно в пакете модуля. Можно использовать любой пакет, если предоставляется полный пакет:

<data class="com.example.ContactItem">
    ...
</data>
person Priyank Patel    schedule 02.04.2016

Перезапустите студию Android или попробуйте переименовать XML-файл на другое имя и проверьте, работает ли привязка, когда она сработает.

person Brahem Mohamed    schedule 28.05.2018

Я столкнулся с той же проблемой,

Если ваше имя XML activity_main.xml, то имя класса DataBinding будет ActivityMainBinding

Если это правильно, проверьте, добавляете ли вы код ниже в свой XML-файл,

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

<data>
    <variable
        name="xyz"
        type="com.example.yourapp.classname" />
   />

</data>

если проблема не в любом из методов, попробуйте

  • чистый проект
  • Восстановить проект
person Dayona Joseph    schedule 18.11.2020

Я пробовал следующие решения, которые у меня не сработали: 1) Недействительный кеш и перезапуск. 2) Перезапустите Android Studio. 3) Восстановить проект.

Что DID решило проблему: 1. Удаление тега «dataBinding» в модуле gradle.build 2. Синхронизация проекта 3 Вернуть тег «привязка данных» 4. Синхронизировать проект снова.

person Nativ    schedule 09.11.2017

Попробуйте перезапустить Android Studio или вручную найдите класс ActivityMainBinding и добавьте свой импорт.

Поместите свой тег данных в последний включенный xml. Вот пример:

MainActivity.java
public class MainActivity extends AppCompatActivity {

    public Item item;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        item = new Item();
        item.setChecked(true);
        item.setName("a");
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.included.secondIncluded.setModel(item);


Item.java
public class Item extends BaseObservable {
    private String name;
    private Boolean checked;
    @Bindable
    public String getName() {
        return this.name;
    }
    @Bindable
    public Boolean getChecked() {
        return this.checked;
    }
    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    public void setChecked(Boolean checked) {
        this.checked = checked;
        notifyPropertyChanged(BR.checked);
    }
}


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="abc"
            android:textSize="20sp" />
        <include
            android:id="@+id/included"
            layout="@layout/included_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</layout>


included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv_title2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="123"
            android:textSize="20sp" />
        <include
            android:id="@+id/second_included"
            layout="@layout/second_included_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</layout>

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

    <data>
        <variable
            name="model"
            type="com.example.simone.twowaydatabinding.Item" />
    </data>

    <LinearLayout
        android:id="@+id/linear_layout_included"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_title1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="xyz"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={model.name}"
            android:textSize="20sp" />
        <Switch
            android:id="@+id/switch_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="@={model.checked}" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="change"
            android:onClick="button_onClick"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/world"/>
    </LinearLayout>
</layout>       
person live-love    schedule 23.07.2018
comment
почему вы дважды вызываете setContentView ()? - person Dima Star; 10.03.2020
comment
Не уверен, не помню, это было давно. На самом деле я решил не использовать привязку данных Android, я обнаружил, что она негибкая. - person live-love; 10.03.2020

Недавно я установил Android Studio 3.5.3, и эта проблема возникла, поэтому я сделал следующее.

1) Clean Project
2) Update Gradle (as notification was coming) 
3) Rebuild project

надеюсь это поможет.

person UMAR-MOBITSOLUTIONS    schedule 20.02.2020

В моем случае: Решить проблему без переименования файла XML.

Я проверил все случаи и сделал все, как Invalidate Caches / Restart Android Studio, clean Project, Rebuild Project, но ошибка не устранена.

Решение. Просто я изменяю код и снова возвращаю этот код в XML-файл активности или изменяю код в XML-файле.

Примечание. Это очень поздний ответ, но он может помочь тем, кто не хочет менять имя XML-файла. :)

person Vibhanshu Shukla    schedule 19.05.2020

попробуйте просмотреть свой xml, если в нем указано неверное значение. Вероятно, дело в неправильных настройках привязки данных

person Aury0n    schedule 17.06.2020

Пожалуйста, поместите этот код в build.gradle (уровень приложения), если он не объявлен.

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

// Android Studio 4.0

android {
    dataBinding.enabled true
    buildFeatures {
        viewBinding = true
    }
}
person apurv thakkar    schedule 23.06.2020

Я тоже столкнулся с той же проблемой. Но после обновления android до androidx решено как

попробуйте изменить android.databinding .... на androidx.databinding ...

person Sujit Acharya    schedule 27.09.2020

В комплекте с тегами макета

<?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="wrap_content">

    </android.support.constraint.ConstraintLayout>
</layout>
person Raviraj    schedule 04.01.2021

Привет, принятый ответ устарел, новый ответ - включить его в build.gradle (: app)

внутри блока Android

buildFeatures {viewBinding true}

работает на 100%

person Zaid Zakir    schedule 01.05.2021

По моему собственному опыту, всякий раз, когда вы включаете макет, убедитесь, что у корневой группы представлений есть идентификатор макета, как показано ниже. Обратите внимание на идентификатор child_layout в файле дочернего макета.

ParentLayout

        <include
            android:id="@+id/child_layout"
            layout="@layout/child_layout"/>

ChildLayout

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/child_layout"
    android:layout_height="match_parent"
    android:background="#FFFFFe">
person Andrew Chelix    schedule 09.05.2021