Не удается разрешить класс привязки данных Android
при использовании привязки данных я не могу получить class MainActivityBinding
по состоянию на Руководство По Привязке Данных
мое имя макета составляет activity_main.xml
.
Я тоже вижу Android-DataBinding-как и когда будут созданы классы привязки? но это не может мне помочь.
16 ответов
класс привязки данных будет создан на основе вашего имени xml-файла. Это четко указано в doc, за которым вы следуете.
по умолчанию класс привязки будет создан на основе имени файла макета, преобразуя его в случай Pascal и суффикса "привязка" к нему. Файл макет был main_activity.xml, поэтому класс generate был MainActivityBinding
если ваше имя xml activity_main.xml
чем имя класса привязки данных будет ActivityMainBinding
.
если ваше имя xml main_activity.xml
чем имя класса привязки данных будет MainActivityBinding
.
не забудьте очистить и построить проект один раз
вы можете следовать этому руководству для получения дополнительной информации о привязка данных
спасибо всем за ответ.Я нашел решение с 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 is макет, где я добавил код макета привязки данных.
поэтому вместо использования MainActivityBinding
он может быть разрешен с ContentMainBinding
код, который работает для меня ниже:
//Code for data binding
ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
user = new User("Pranay", "Patel", "demoemail@gmail.com", "9999999999");
contentMainBinding.setUser(user);
сделано.
попробуйте переименовать xml-файл в другое имя и проверить, работает ли привязка Как только он работает, переименуйте его обратно в тот, который использовался.
, который помог Android Studio 3.1
Если имя класса привязки данных правильно и вы использовали для очистки и перестроения проекта, но он по-прежнему показывает ошибку.
Тогда попробуйте перезагрузка AndroidStudio
Я не получил никакого удовлетворительного ответа. Итак, вот советы, которые я привязки данных знаний.
советы по уменьшению времени застревания в привязке данных.
этот ответ поможет вам создать класс привязки данных и также создать переменные макета в классе привязки данных.
пункт 3-последние действительно важны, поэтому не пропустите их.
1. Проверка привязки данных включено
вы должны есть!--28-->привязка данных включена на build.gradle
. Если нет, то добавьте это и синхронизация.
android {
...
dataBinding {
enabled = true
}
...
}
2. Проверка макета преобразуется в привязку layout
теперь, если вы хотите, чтобы класс привязки данных был сгенерирован, вы должны обертывание xml layout
С привязкой данных (<layout
tag). Что-то вроде этого.
<?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
.
-
иногда, когда вы типа
ActivityMai...
, потом не показывает предложение в этом случае импорт класса вручную.import <yourpackage>databinding.ActivityMainBinding;
4. Проверьте макеты на наличие ошибок
ваш класс привязки и новые переменные в макете не будут сгенерированы, если ваша сборка завершится неудачно. Так что сделать проект by Ctrl + F9 (сборка > сделать проект).
- если сборка не удается, то посмотрите, что такое ошибка, обычно у нас есть ошибки в полях макета. Журналы ошибок укажут номер строки ошибки с причиной.
5. Закрыть и открыть проект из последних
Я всегда делаю это, потому что это занимает гораздо меньше времени, чем Rebuild
/ .
- закрыть проект из файла > закрыть проект
- открыть снова из последних
отметим, что предпочитаю закрыть и открыть С последние потому что это занимает много меньше времени, чем перестроить / перезапустить IDE.
6. Перестроить Проект
если еще ваш класс не создается. (Некоторое время, когда мы вставляем файл макета, тогда это происходит). Тогда Перестроить Проект С Build> Rebuild
(не строить и не делать проект). Он будет генерировать ваш класс привязки данных. (Rebuild делает магию для меня.)
7. Есть последняя Android Studio
после обновления как Android Studio 3.2, я чувствовал, что многие исправления ошибок в привязке данных автогенерации. Поэтому у вас также должны быть последние КАК.
решение <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
- первый попробуй!--28-->просто перезапустить, это всегда генерирует переменные моего макета привязки после перезапуска.
- если не работает, то Аннулировать Кэш И Перезапустить.
это все, что я делаю, чтобы решить мои ошибки привязки данных. Если вы получите какие-либо дополнительные вопросы, вы можете прокомментировать здесь.
в таких случаях, если ни перестроить, ни аннулировать работу кэшей, то должна быть ошибка в одном из ваших xml-файлов, где вы могли использовать @{xyz.abc} и должна быть проблема с xyz или abc в xml.
я очистил проект, Восстановление было сделано...но бесполезно. Затем аннулировал кэши и перезапустил проект, который мне тоже не помог.
затем я изменил имя xml-файла-это сработало фантастически хорошо.
Итак, я хотел бы поделиться с вами одной вещью, пожалуйста, измените имя xml-файла.
например: если ваш xml-файл: activity_main.xml, и вы не можете получить ActivityMainBinding в своем классе Java..........затем измените имя xml на main_activity.XML а затем используйте MainActivityBinding в своем классе java как " частная привязка MainActivityBinding;"
Это, скорее всего, подойдет.
проверьте, что xml и класс activity/fragment имеют согласованные имена; например, если у вас есть TimePickerFragment
чем имя файла xml должно быть time_picker_fragment
.
мне пришло в голову, что у меня есть макет с именем fragment_time_picker
; после того, как я изменил его, была создана привязка.
класс привязки будет создан на основе имени файла макета. От по умолчанию имя класса основано на имени макета файл, преобразующий его в Pascal case и добавляющий к нему суффикс привязки
например, Если имя xml-activity_main.xml тогда имя класса привязки данных будет 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);
Не могу комментировать, поэтому я просто добавлю это в ответ. Я верю в activity_main.xml создаст ActivityMainBinding, а не MainActivityBinding, как вы упомянули. в некоторых случаях, когда studio не может найти класс привязки, просто аннулируйте кэши и перестройте проект.
по умолчанию класс привязки создается на основе имени файла макета, начиная его с верхнего регистра, удаляя подчеркивания ( _ ) и заглавной буквы, а затем суффикса "привязка".
этот класс будет помещен в пакет привязки данных под пакетом модуля.
например, файл макета 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>
Я пробовал следующие решения, которые не работают для меня: 1) аннулировать кэш и перезапустить. 2) Перезапустите Android Studio. 3) перестроить проект.
что исправило проблему: 1. Удаление тега "dataBinding" в модуле gradle.строить 2. Проект синхронизации 3 возврат тега" databinding" 4. Синхронизация проекта снова.
перезапустите Android studio или попробуйте переименовать XML-файл в другое имя и проверьте, работает ли привязка после ее работы.
попробуйте перезапустить 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>
в моем случае удаление папки сборки приложения, а затем восстановление проекта решило мою проблему.
даже следующие шаги не сработали.
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 приложения, пожалуйста, перестройте. Затем мы можем найти класс привязки.
If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
У меня была такая же проблема после изменения имени пакета моего источника, после того, как я попробовал много вещей (включая упомянутые здесь), я решил проблему, импортировав класс привязки данных вручную:
import com.domain.my.databinding.MyActivityBinding;