85

我开始使用DataBinding功能。我正面临着它的问题。

错误:(21, 9) 错误:找不到符号类 ContactListActivityBinding

build.gradle(模块:应用程序)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.letsnurture.ln_202.databindingdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

ContactListActivity.java

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import com.letsnurture.ln_202.databindingdemo.model.Contact;

public class ContactListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
        Contact user = new Contact("Chintan Soni", "+91 9876543210");
        binding.setContact(user);

//        setContentView(R.layout.activity_contact_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_contact_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

content_contact_list.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"
    tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity"
    tools:showIn="@layout/activity_contact_list">

    <data>

        <variable
            name="user"
            type="com.letsnurture.ln_202.databindingdemo.model.Contact" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.contactName}"
            tools:text="Name" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.contactNumber}"
            tools:text="Number" />
    </LinearLayout>
</layout>

activity_contact_list.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.letsnurture.ln_202.databindingdemo.ContactListActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_contact_list" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>
4

31 回答 31

46

我一直遇到这个问题。我相信这与 android studio 不知道动态生成的文件有关。如果您对数据绑定具有其他一切权利,请尝试 File > Invalidate Caches/Restart... 并选择 Invalidate Caches and Restart。然后尝试导入 BR 文件...它应该可以正常导入。

您可能必须投入清洁和重建。

于 2016-06-03T22:40:30.293 回答
31

您可以查看主要答案以获取有关数据绑定错误和解决方案的完整信息。我将尝试在下面讲述一些重要的观点。

我用来解决绑定问题的 5 个技巧。

假设您已启用数据绑定build.gradle并且您已将布局转换为绑定布局

首先,当您将布局转换为绑定布局时,绑定类会自动生成。当后台线程不工作时,有时它仍然不会生成。这里有一些技巧可以帮助您解决这个问题。

(1) 生成类名称

布局名称在snake_case activity_main.xml

数据绑定类将在PascalCase中,如ActivityMainBinding.

(2)。键入 Binding 类的全名

我感觉有时当你输入时ActivityMai...,它没有显示建议,但这并不意味着没有生成类。在这种情况下,您应该输入预期生成的类的全名。像 type 一样ActivityMainBinding,它会显示 import popup。(这就是我多次面临的问题。)

仍然没有得到进口建议。尝试手动导入。

import <yourpackage>databinding.ActivityMainBinding;

(3)。重建项目

如果仍然没有生成您的课程。(有时当我们粘贴布局文件时,它会发生)。然后从(不构建或制作项目)重建项目。它将生成您的数据绑定类。(重建一直为我做魔法。Build> Rebuild

(4)<variable如果您在布局中创建了一个并且它没有在数据绑定类中显示它的 setter 和 getter,那么请遵循第 4 点

(5)如果您的类没有生成,那么您应该检查构建是否由于布局文件中的错误而失败。数据绑定类将在成功构建时生成。

这就是我为解决数据绑定错误所做的一切。如果您有任何进一步的问题,您可以在这里发表评论。

来源答案

于 2018-08-17T12:06:29.067 回答
23

请参考安卓开发者指南

布局文件是 main_activity.xml,所以生成的类是 MainActivityBinding

由于您的 xml 名为“activity_contact_list.xml”,因此您应该使用ActivityContactListBinding而不是原来的

于 2017-02-03T10:54:20.897 回答
22

当布局文件有问题时,可能会出现此问题。就我而言,我只是使用错误的方式来调用方法

android:onClick="@={() -> viewModel.showText()}"

代替

  android:onClick="@{() -> viewModel.showText()}"
于 2019-09-05T08:01:13.920 回答
17

实际上它可能由于各种原因而发生,并且由于数据绑定中的日志记录机制不良,很难找到原因。所以首先去终端并运行以下命令 -

gradlew :app:build --stacktrace

它将向您显示正确的错误以及在 XML 中发现错误的行数。

例如 -

ERROR: Could not find accessor com.example.model file://app\src\main\res\layout\fragment_example.xml Line:91
于 2020-10-03T07:16:51.180 回答
10

不正确的包名也可能导致上述错误。从 Android Gradle 插件 3.2 开始(据我所知) CamelCase 包名称将被错误地推断为classes,这将破坏生成的绑定对象。

例子:

src
|
-> FooPackage
    |
    -> Bar.java

将错误地生成为

import src.FooPackage

...

public abstract class MyBinding extends ViewDataBinding {
    @NonNull
    public final FooPackage.Bar mInstance;
...
}

这显然没有任何意义。

FooPackage根据java约定重构foopackage并保存。然后你会得到:

import src.foopackage.Bar

...

public abstract class MyBinding extends ViewDataBinding {
    @NonNull
    public final Bar mInstance;
...
}
于 2019-04-07T11:53:18.880 回答
8

这是你的代码

ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);

替换此代码

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
于 2016-07-04T07:00:31.573 回答
5

您需要在活动布局中声明并传递绑定,而不是在包含的布局中。

文档中的示例:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
  </LinearLayout>
</layout>

在这里,name.xml 和contact.xml 布局文件中都必须有一个用户变量。

于 2016-02-01T09:24:16.337 回答
5

我打电话onClick错了,这导致了这个错误。所以我改变了

android:onClick="@{listener.onDogClicked()}"

android:onClick="@{listener::onDogClicked}"
于 2020-03-02T06:13:07.743 回答
4

不要忘记添加应用级别的gradle,apply plugin: 'kotlin-kapt'

于 2019-10-16T10:08:50.680 回答
4

你需要检查你的布局文件,这个错误是由于错误使用了数据绑定表达式,即你可能没有使用正确的语法

于 2021-05-30T10:38:29.423 回答
4

确保您的模型名称和引用具有相同的名称:

例如,name= "item"必须匹配 android:checked="@={ item .checked}"

<data>
    <variable
        name="item"
        type="com.simone.mywordlist.model.MyModel" />
</data>

            <Switch
                android:id="@+id/my_switch"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="@={item.checked}"
            />
于 2018-03-19T16:40:56.540 回答
2

我遇到了同样的问题,我发现变量名和方法丢失了。仔细检查布局文件或查找显示 DATABINDINGISSUE 的构建错误,或者使 android studio 无效并重新启动。它应该工作。

于 2020-01-27T04:59:54.530 回答
2

您必须更改activity_contact_list要绑定的 - 添加布局标记,就像在 中所做的那样content_contact_list。不要忘记,里面的根布局activity_contact_list必须有一个 id 才能生成 Binding 类,并且将被命名为ActivityContactListBinding(即带有驼峰类型而不是下划线的布局名称)。

接下来,在里面activity_contact_list,给<include layout="@layout/content_contact_list" />一个 id,然后你就可以通过你的 ActivityContactListBinding 实例访问它的绑定实例。

像:

binding.contentContactList.setContact(user);

让我知道它是否有效。

于 2016-02-14T14:25:22.710 回答
2

我遇到了同样的错误,但使用了 Kotlin。

为了解决它,我对 gradles 文件进行了一些更改:

项目的 Gradle 文件中:

dependencies {
    classpath "com.android.tools.build:gradle:3.1.2"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40"
}

app的 Gradle 文件中:

dependencies {

    ...
    implementation "android.arch.lifecycle:extensions:1.1.1"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.30"
    kapt 'com.android.databinding:compiler:3.1.2'
}


kapt {
    generateStubs = true
}

//used to resolve annotation conflicts
configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}
于 2018-05-09T16:51:03.963 回答
2

如果您更改了对象包位置并且忘记将其更新导入信息到 xml,则可能会发生该错误。请检查您的对象包位置及其 xml 导入包位置。

于 2021-10-06T07:53:59.223 回答
2

在我的项目中,这是一个麻烦:

android:text="@{safeUnbox(viewmodel.population)}"

所以我把它包装在String.valueOf()

android:text="@{String.valueOf(safeUnbox(viewmodel.population))}"

并且解决了

于 2020-01-27T13:34:30.580 回答
2

就我而言,我遇到了同样的问题,但原因不同。我的 onClick 函数在活动类中被声明为私有,因此请确保,如果您在布局内使用处理函数,则该函数不能是私有的

// this will not be visible in the binded layout because it's private!
private fun mainButtonClick(view: View) {
    if (viewModel.isRecording.value == true) {
        stopRecordingAndPlaying()
    } else {
        startRecordingAndPlaying()
    }
}
于 2019-10-13T19:46:23.633 回答
2

有时这些错误的原因不是DataBinding本身,而是我们代码的其他部分。在我的情况下,我在Room数据库中有一个错误,所以编译器无法生成绑定类,它给了我这些错误。

根据谷歌

以前版本的数据绑定编译器在编译托管代码的同一步骤中生成绑定类。如果您的托管代码编译失败,您可能会收到多个错误报告,报告找不到绑定类。新的数据绑定编译器通过在托管编译器构建您的应用程序之前生成绑定类来防止这些错误。

因此,要启用新的数据绑定编译器,请将以下选项添加到您的gradle.properties文件中:

android.databinding.enableV2=true

您还可以通过添加以下参数在 gradle 命令中启用新编译器:

-Pandroid.databinding.enableV2=true

请注意,Android Studio 3.2版中的新编译器默认启用

于 2019-01-06T11:36:27.187 回答
1

您需要将标签添加到 Activity 的 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">
    <data>
        <variable
             name=""
             type="" />
    </data
    <android.support.design.widget.CoordinatorLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
  tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity">

    </android.support.design.widget.CoordinatorLayout>
</layout>

然后,将 android:id 添加到您的标签中

之后,您将拥有一个 ActivityContactListBinding 对象,并且您可以访问和绑定包含的布局上的变量。

于 2019-05-11T00:56:11.300 回答
1

当我在没有 viewBinding 的情况下尝试这个时,我遇到了同样的问题

  buildFeatures {
        dataBinding true
    }

这将给出该错误,同时使视图绑定一切正常工作

  buildFeatures {
        dataBinding true
        viewBinding true
    }
于 2021-05-30T12:08:25.370 回答
1

我陷入了这个问题,因为我的 Activity 被称为 MainActivityMVVM 并且 Binding 被转换为MainActivityMvvmBinding而不是MainActivityMVVMBinding. 在深入研究生成的类后,我发现了问题。

于 2017-10-11T22:38:39.180 回答
1

只需删除您项目目录中的“build”文件夹并再次编译,我希望它也适用于您

于 2019-04-29T21:21:23.420 回答
1

对我来说,这是布局 xml 绑定中的错误,我有

应用程序:setNameString="@{person}"

代替

app:nameString="@{person}"

类型名称必须与您在 @BindingAdapter 类中设置的名称匹配(如果您使用的是绑定适配器)

于 2020-05-13T10:06:47.013 回答
1

关键

您的布局名称位于snake_case中。

activity_login.xml

然后您的绑定类名称将在CamelCase中。

ActivityLoginBinding.java

创建布局后还要构建项目。有时它不是自动生成的。

于 2018-08-09T09:10:09.777 回答
1

在确保命名约定是正确的,如其他答案中所述,并尝试使缓存无效并重新启动,删除临时/缓存文件夹后,问题仍然存在。

我按如下方式摆脱它:添加一个新的虚拟 XML 资源。这将触发绑定及其元数据在整个项目中重新创建。烦人的编译错误应该不再可见。现在删除添加的虚拟 XML。

对我而言,截至 2020 年 8 月,绑定会自动反复损坏。它似乎咬得比它在引擎盖下咀嚼的要多。

于 2020-08-13T04:01:52.400 回答
0

使您在绑定到小写时使用的项目中的所有包名称。

于 2021-01-31T14:17:56.367 回答
0

您的模型在androidX中只有getter 和 setter 。 否则在视图中找不到您的模型并显示此错误

public class User {

String name;

public String getName() {
    return name;
}
public User(String name) {
    this.name = name;
}

}

于 2019-11-28T21:06:23.663 回答
0

您的问题实际上可能在这一行:

<include layout="@layout/content_contact_list" />

Android Studio 有时会感到有些困惑,并采用了include layoutforlayout标签。更令人沮丧的是,这可能会在第一次工作,稍后对 Java/Kotlin 代码的修改无法工作,然后在强制它重建绑定的调整后再次工作。您可能希望将<include>标签替换为动态填充的内容。

于 2020-10-12T10:49:50.953 回答
0

就我而言,在生成的数据绑定类中有一个与缺少的导入同名的包。编译器似乎很困惑。

于 2018-10-26T02:55:31.010 回答
0

就我而言,我正在将onClick函数调用异步/suspend函数,这给了我一个错误cannot find a symbol class ... impl

.xml 文件

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

    <data>
        <variable
            name="dataFragment"
            type="com.example.todoapp.fragment.SubmissionFragment" />
    </data>
    
    <Button
        android:id="@+id/keepBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:onClick="@{() -> dataFragment.submit()}"
        android:text="Add" />
</layout>

. 片段文件

private lateinit val stringList: List<String>

...

suspend fun submit() {
        dataDao.insert(stringList)
        val action = SubmissionFragmentDirections.actionSubmissionFragmentToTodoFragment()
        findNavController().navigate(action)
    }

然后我通过删除挂起功能替换为并Async Method插入Launch MethodviewModelScope.launch

fun submit() {
    viewModelScope.launch {
       dataDao.insert(stringList)
    }

    val action = SubmissionFragmentDirections.actionSubmissionFragmentToTodoFragment()
    findNavController().navigate(action)
    }

参考:https ://www.geeksforgeeks.org/launch-vs-async-in-kotlin-coroutines/

于 2021-11-07T06:00:27.437 回答