无法解析Android数据绑定类

时间:2016-03-09 05:16:25

标签: android data-binding android-databinding

使用数据绑定时,我无法按Data Binding Guide

获取课程MainActivityBinding

我的布局名称是activity_main.xml。 我也看到Android - DataBinding - How and when the Binding classes will be generated?,但它无法帮助我。

26 个答案:

答案 0 :(得分:72)

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

  

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

如果您的xml名称为activity_main.xml,则DataBinding类名称为ActivityMainBinding

如果您的xml名称为main_activity.xml,则DataBinding类名称为MainActivityBinding

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

您可以按照本教程了解有关DataBinding

的更多信息

答案 1 :(得分:19)

TRY将xml文件重命名为另一个名称并检查绑定是否有效一旦将其重命名为已使用的那个。

这有助于 Android Studio 3.1

答案 2 :(得分:17)

感谢大家的回答。我找到了带有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);

DONE。

答案 3 :(得分:7)

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

答案 4 :(得分:6)

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

然后我改变了我的xml文件名 - 这非常好。

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

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

这很有可能。

答案 5 :(得分:5)

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

答案 6 :(得分:4)

检查您的activity / fragment的xml和类是否具有一致的名称;例如,如果您有TimePickerFragment而不是xml文件名应为time_picker_fragment

我想到我的布局名为fragment_time_picker;在我更改之后,生成了绑定。

答案 7 :(得分:3)

  

将根据您的布局文件名生成绑定类。通过   默认情况下,类的名称基于布局的名称   文件,将其转换为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);

答案 8 :(得分:2)

默认情况下,会根据布局文件的名称生成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>

答案 9 :(得分:2)

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

dataBinding {         启用true     }

答案 10 :(得分:2)

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

以下步骤也不起作用。

          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文件中启用dataBinding之后,请重新构建。然后我们可以找到生成的Binding类。

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

答案 11 :(得分:2)

更改源的程序包名称后,我遇到了同样的问题,尝试了很多事情(包括此处提到的问题)后,我通过手动导入数据绑定类解决了该问题:

import com.domain.my.databinding.MyActivityBinding;

答案 12 :(得分:1)

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

答案 13 :(得分:1)

我面临着同样的问题,

如果您的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>

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

  • 清洁项目
  • 重建项目

答案 14 :(得分:1)

确保您的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>

答案 15 :(得分:1)

重新启动Android studio或尝试将XML文件重命名为其他名称,并检查绑定是否有效。

答案 16 :(得分: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>       

答案 17 :(得分:0)

我最近安装了android studio 3.5.3,此问题上升了,所以我做了。

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

希望这会有所帮助。

答案 18 :(得分:0)

就我而言:无需重命名XML文件即可解决问题。

我检查了所有情况,并做了所有操作,例如使缓存无效/重新启动Android Studio,清理项目,重建项目,但该错误没有得到解决。

解决方案-只是我更改了一些代码,然后再次在活动XML文件中恢复了该代码,或者更改了XML文件中的代码。

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

如果未声明,请将此代码放在build.gradle(应用程序级别)中。

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

// Android Studio 4.0

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

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

DID解决了什么问题: 1.删​​除模块gradle.build中的“dataBinding”标记 2.同步项目 3返回“数据绑定”标签 4.再次同步项目。

答案 23 :(得分: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>

答案 24 :(得分:0)

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

在android块内

buildFeatures { viewBinding true }

100% 有效

答案 25 :(得分: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">