60

While using data binding , I am not able to get class MainActivityBinding as per Data Binding Guide

My layout name is activity_main.xml. I am also see Android - DataBinding - How and when the Binding classes will be generated? but it can't help me.

4

29 回答 29

103

DataBinding 类将根据您的 xml 文件名生成。您正在关注的文档中明确提到了这一点。

默认情况下,会根据布局文件的名称生成一个Binding类,将其转换为Pascal大小写,并为其添加“Binding”后缀。上面的布局文件是 main_activity.xml 所以生成的类是 MainActivityBinding

如果您的 xml 名称activity_main.xml比 DataBinding 类名称将是ActivityMainBinding.

如果您的 xml 名称main_activity.xml比 DataBinding 类名称将是MainActivityBinding.

不要忘记清理和构建项目一次

您可以按照本教程了解有关DataBinding的更多信息

于 2016-03-09T05:22:30.713 回答
26

尝试将 xml 文件重命名为另一个名称,并在绑定工作后检查绑定是否有效,将其重命名为使用过的名称。

这对Android Studio 3.1有帮助

于 2018-04-19T10:56:28.593 回答
20

感谢大家的回答。我找到了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", "demoemail@gmail.com", "9999999999");
    contentMainBinding.setUser(user);

完毕。

于 2016-03-09T06:13:56.697 回答
12

确保您的 activity_main.xml 文件包含如下布局标签:

<?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>
于 2019-03-29T06:24:36.963 回答
9

如果DataBinding 类名正确,并且您曾经清理和重建项目,但它仍然显示错误。
然后你尝试重启AndroidStudio

于 2016-11-02T10:57:48.060 回答
8

我已经清理了项目,重建完成了......但没有用。然后使缓存无效并重新启动也没有帮助我的项目。

然后我更改了我的 xml 文件名——效果非常好。

所以,我想与您分享一件事,请更改您的 xml 文件名。

例如:如果您的 xml 文件是:activity_main.xml 并且您无法在其 Java 类中获取 ActivityMainBinding ......然后将 xml 名称更改为 main_activity.xml,然后在其 java 类中使用 MainActivityBinding 作为'私有 MainActivityBinding 绑定;'

这很可能会做到。

于 2018-05-16T04:28:22.720 回答
7

在这种情况下,如果重建或无效缓存都不起作用,那么您可能使用过 @{xyz.abc} 的其中一个 xml 文件中一定有错误,并且 xml 中的 xyz 或 abc 一定有问题。

于 2017-09-05T13:32:00.623 回答
6

就我而言,删除应用程序构建文件夹然后重建项目解决了我的问题。

即使以下步骤也不起作用。

          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

在 app gradle 文件中启用 dataBinding 后,请重新构建。然后我们可以找到生成的Binding类。

          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
于 2018-08-03T06:54:20.937 回答
6

我在更改源的包名后遇到了同样的问题,在我尝试了很多东西(包括这里提到的)之后,我通过手动导入数据绑定类解决了这个问题:

import com.domain.my.databinding.MyActivityBinding;
于 2018-08-17T08:02:44.023 回答
5

确保在 build.gradle 文件中添加以下行

数据绑定 { 启用 true }

于 2019-08-04T17:33:29.990 回答
4

绑定类将根据您的布局文件名生成。默认情况下,类的名称是根据布局文件的名称,将其转换为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);
于 2018-05-06T11:43:54.940 回答
4

检查您的活动/片段的 xml 和类是否具有一致的名称;例如,如果你有TimePickerFragment比 xml 文件名应该是time_picker_fragment.

我突然想到我的布局名为fragment_time_picker; 在我改变它之后,绑定就生成了。

于 2017-04-19T17:03:22.090 回答
2

重新启动 Android Studio 或尝试将 XML 文件重命名为另一个名称,并检查绑定是否有效。

于 2018-05-28T14:46:48.360 回答
2

无法发表评论,所以我将在答案中添加此内容。我相信 activity_main.xml 将创建 ActivityMainBinding 而不是您提到的 MainActivityBinding 。在某些情况下,工作室找不到绑定类,然后只是使缓存无效并重建项目。

于 2016-03-09T05:25:26.680 回答
2
于 2016-04-02T19:09:18.473 回答
1

就我而言:在不重命名 XML 文件的情况下解决问题。

我检查了所有情况,我做了所有事情,比如使缓存无效/重新启动 Android Studio、清理项目、重建项目,但是错误没有解决。

解决方案 - 只需更改一些代码并在活动 XML 文件中再次恢复该代码或更改 XML 文件中的代码。

注意 - 这是非常晚的答案,但可能会帮助其他不想更改 XML 文件名的人。:)

于 2020-05-19T10:54:39.627 回答
1
  1. 确认在android {}中添加以下代码build.gradle (:app)
    buildFeatures {
       viewBinding true
    }
  1. Binding的名称是对应的.xml文件名+“绑定”,要检查.xml文件,按住command并单击Activity名称,然后你跳转到那个.xml文件或者你可能会得到一个下拉列表。无论如何,您都可以获得Binding。 在此处输入图像描述

3.如果还是不行就重启Android Studio

于 2021-09-18T09:58:40.420 回答
1

我面临同样的问题,

如果您的 XML 名称是activity_main.xmlDataBinding类名将是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>

如果任何一种方法都不是问题,请尝试

  • 清洁项目
  • 重建项目
于 2020-11-18T12:09:53.873 回答
0

尝试重新启动 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>       
于 2018-07-23T02:07:01.707 回答
0

仅供参考,我正在使用Android Studio Bumblebee | 2021.1.1

我尝试了所有基本步骤,例如

  • 清理和构建项目
  • 使缓存无效并重新启动

以上都不起作用。然后我在浏览了Gradle文件后自己找到了它。

将以下代码添加到标签module/build.gradle内的文件中。android

kotlinOptions {
    jvmTarget = '1.8'
}
于 2022-02-01T13:34:35.973 回答
0

如果未声明,请将此代码放入 build.gradle(app level) 中。

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

// 安卓工作室 4.0

android {
    dataBinding.enabled true
    buildFeatures {
        viewBinding = true
    }
}
于 2020-06-23T09:58:16.433 回答
0

我尝试了以下对我不起作用的解决方案:1)使缓存无效并重新启动。2) 重启安卓工作室。3) 重建项目。

DID 解决问题的是: 1. 删除模块 gradle.build 中的“dataBinding”标签 2. 同步项目 3 返回“databinding”标签 4. 再次同步项目。

于 2017-11-09T09:08:44.477 回答
0

我最近安装了 android studio 3.5.3 并且这个问题出现了,所以我所做的是。

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

希望这可以帮助。

于 2020-02-20T14:21:34.467 回答
0

附有布局标签

<?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>
于 2021-01-04T11:48:56.403 回答
0

以我自己的经验,每当您包含布局时,请确保根视图组具有如下所示的布局 ID。请注意child_layout子布局文件中的 id。

父布局

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

子布局

<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">
于 2021-05-09T04:51:29.507 回答
0

嗨,接受的答案已过时,新的答案是将其包含在 build.gradle(:app) 中

在 android 块内

buildFeatures { viewBinding true }

工作 100%

于 2021-05-01T04:35:21.810 回答
0

尝试查看您的 xml,如果有一个设置错误的值。这可能与错误的数据绑定设置有关

于 2020-06-17T18:49:56.617 回答
0

里面的这条线module/build.gradle为我解决了这个问题:

buildFeatures {
    viewBinding true
}
于 2022-02-19T18:19:26.120 回答
0

我也面临同样的问题。但是在将android更新到androidx之后解决了

尝试将 android.databinding.... 更改为 androidx.databinding...

于 2020-09-27T00:37:30.143 回答