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

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

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

Ответ 1

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

ПРИМЕЧАНИЕ. При использовании макета с <include... здесь <include layout="@layout/content_main" имеющее функциональность <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);

СДЕЛАННЫЙ.

Ответ 2

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

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

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

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

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

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

Ответ 3

TRY Переименование xml файла на другое имя и проверьте, работает ли привязка, когда он работает, переименовывая его обратно в тот, который был использован.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Затем я сменил имя файла xml, которое получило фантастическое представление.

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

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

Это, скорее всего, будет.

Ответ 7

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

Ответ 8

Класс привязки будет создан на основе вашего имени файла макета. По умолчанию имя класса основано на имени файла макета, преобразует его в регистр Pascal и добавляет к нему суффикс 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);

Ответ 9

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

Ответ 10

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

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

Например, файл компоновки contact_item.xml будет генерировать ContactItemBinding.

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

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

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

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

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

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

Попробуйте перезагрузить 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>       

Ответ 14

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

Этот ответ поможет вам создать класс привязки данных, а также создать переменные макета в классе привязки данных.

7 Советы по удалению застрявшего времени в привязке.

(1) Установите привязку данных в build.gradle.

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

(2) Теперь, если вы хотите, чтобы класс привязки данных был сгенерирован, вы должны обернуть xml layout с привязкой данных ( <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) Если ваше имя макета находится в объекте змейки activity_main.xml тогда класс привязки данных будет создан в случае верблюда, например ActivityMainBinding.

(4). Введите полное имя класса Binding

Иногда я чувствовал, когда вы вводите ActivityMai..., то он не показывает предложения, но это не означает, что класс не генерируется. В этом случае вы должны ввести полное имя ожидаемого сгенерированного класса. Подобно типу ActivityMainBinding и он отображает всплывающее окно импорта. (Это то, с чем я сталкивался много раз.)

(5). Реконструкция проекта (Мое мощное оружие)

Если ваш класс не сгенерирован. (Некоторое время, когда мы вставляем файл макета, это происходит). Затем перестройте проект из Build> Rebuild (не строить или сделать проект). Он будет генерировать ваш класс привязки данных. (Rebuild does Magic для меня все времена.)

(6) Если вы создали <variable в своем макете и она не отображает свой сеттер и getter в классе привязки данных, то следуйте 4-й точке.

(7) Тем не менее, если ваш класс не создается, вы должны проверить, не строит ли сборка из-за ошибки в вашем файле макета. Класс привязки данных будет генерировать с успешной сборкой.

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

Ответ 15

В моем случае DELETING в папке создания приложения, а затем при восстановлении проекта решена моя проблема.

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

          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

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

          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.

Ответ 16

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

import com.domain.my.databinding.MyActivityBinding;