【问题标题】:Can't resolve Android databinding class无法解析 Android 数据绑定类
【发布时间】:2016-06-23 08:20:13
【问题描述】:

在使用数据绑定时,我无法按照Data Binding Guide 获得类MainActivityBinding

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

【问题讨论】:

  • 你的活动名称是什么??
  • @MD 我的活动名称是:MainActivity.java
  • 清理并构建项目,这将再次生成 DataBinding 类,正如@RRR 所说
  • 我注意到如果 xml 布局文件直接从约束布局开始,它将无法工作。将所有内容包装在 中,将 xmlns:android="..."、xmlns:app="..." 和 xmlns:tools="..." 移动到其中,然后清理并重建。应该出现绑定对象。也正如其他人所说,请确保您的命名正确。

标签: android data-binding android-databinding


【解决方案1】:

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

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

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

如果您的 xml 名称是 main_activity.xml,那么 DataBinding 类名称将是 MainActivityBinding

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

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

【讨论】:

  • 我确定布局名称已在我的问题中添加。
  • 是的,但有问题你提到了 activity_main.xml 并使用 MainActivityBinding ,它应该是 ActivityMainBinding
  • 确保在添加xml组件后重新构建项目,以便生成这个类。
  • 如果您遇到无法解析的符号,请尝试将布局包装在 <layout> 标记中。
  • 每当您使用绑定时,请按照步骤 1:首先在 gradle 中执行 dataBinding {enabled = true } ..同步它 ..2:使用 标记如果你有 viewmodel 然后将它应用到 在你的布局标记 3:然后去你的活动并在那里看到 ActivityMainBinding .. 如果没有再次重建它,看到它必须在那里 ..谢谢
【解决方案2】:

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

这对 Android Studio 3.1

有帮助

【讨论】:

  • 总比重启IDE好
  • 有趣的是,AS 甚至没有重命名 xml 文件。当我从资源管理器更改时,自动检测到绑定类。一个经典的错误!谢谢指点。
  • 很棒的人..多么棒的答案。谁能想到重命名会解决它(嗯……Android工作室!!!……)。我一直在通过书籍跟进它并且没有工作,但这个技巧解决了它。
  • 这对我有用,但我有很多懒惰,没有其他解决方案吗? (Android 3.2)
  • @GilbertoIbarra 你能试试重启android studio吗
【解决方案3】:

感谢大家的回答。我找到了使用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 是我添加数据绑定布局代码的布局。

因此,可以使用 ContentMainBinding

来解决,而不是使用 MainActivityBinding

对我有用的代码如下:

//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);

完成。

【讨论】:

  • 你自欺欺人了,它会设置你的activity layout content_main.xml,而不是activity_main.xml,你发现的是默认的将activity附加到layout的方式。
  • 不要遵循这个答案,它会设置布局content_main,如果你想膨胀activity_main.xml然后用&lt;layout标签包裹它。并使用ActivityMainBinding class
  • 感谢@Khemraj 的建议。这是一个古老的答案。它可能有错误。如果可以的话,你能更新答案吗?
【解决方案4】:

确保您的 activity_main.xml 文件包含有 layout 标记,如下所示:

<?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>

【讨论】:

  • 只需在 XML 中的任何位置添加 &lt;layout&gt; 标记即可解决问题。
  • 它节省了我的一天实际上我忘记这样做了
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

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

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

    这很有可能。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        在我的情况下,删除应用程序构建文件夹然后重建项目解决了我的问题。

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

                  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.
        

        【讨论】:

        • 我还尝试将绑定生成类型从 AS 内置更改为编译器,反之亦然,重新启动 AS。什么都没发生。昨天一切正常
        • 我浪费了一个小时来解决这个问题,然后我尝试了你的解决方案,我更改了 xml 的名称,但它仍然不起作用,然后我重建,干净重启,它就起作用了。谢谢
        【解决方案9】:

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

        import com.domain.my.databinding.MyActivityBinding;
        

        【讨论】:

          【解决方案10】:

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

          数据绑定{ 启用 true }

          【讨论】:

            【解决方案11】:

            检查你的activity/fragment的xml和class是否有一致的名字;例如,如果您有 TimePickerFragment,则 xml 文件名应该是 time_picker_fragment

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

            【讨论】:

              【解决方案12】:

              将根据您的布局文件名生成绑定类。经过 默认,类名以布局名为准 文件,将其转换为 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);
              

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

                  默认情况下,根据布局文件的名称生成一个Binding类,以大写开头,去掉下划线(_),后面的字母大写加“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>
                  

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      【解决方案16】:

                      在我的例子中:在不重命名 XML 文件的情况下解决问题。

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

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

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

                      【讨论】:

                        【解决方案17】:

                        我遇到了同样的问题,

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

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

                        • 清理项目
                        • 重建项目

                        【讨论】:

                          【解决方案18】:
                          1. 确认在android {}中添加以下代码build.gradle (:app)
                              buildFeatures {
                                 viewBinding true
                              }
                          
                          1. Binding的名字是对应的.xml文件名 + "Binding",查看.xml文件,按住command点击Activity名称,跳转到那个.xml文件或者你可能会得到一个下拉列表。无论如何,您都可以获得Binding。

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

                          【讨论】:

                            【解决方案19】:

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

                            解决问题的方法是: 1.移除模块gradle.build中的“dataBinding”标签 2.同步项目 3 返回“数据绑定”标签 4. 再次同步项目。

                            【讨论】:

                              【解决方案20】:

                              尝试重新启动 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>       
                              

                              【讨论】:

                              • 为什么调用 setContentView() 两次?
                              • 不知道,我不记得了,这是很久以前的事了。我实际上决定不使用 Android 数据绑定,我发现它不灵活。
                              【解决方案21】:

                              我最近安装了 android studio 3.5.3,这个问题出现了,所以我做了什么。

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

                              希望这会有所帮助。

                              【讨论】:

                                【解决方案22】:

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

                                【讨论】:

                                  【解决方案23】:

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

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

                                  // Android Studio 4.0

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

                                  【讨论】:

                                    【解决方案24】:

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

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

                                    【讨论】:

                                      【解决方案25】:

                                      附上布局标签

                                      <?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>
                                      

                                      【讨论】:

                                        【解决方案26】:

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

                                        在 android 块内

                                        buildFeatures { viewBinding true }

                                        100% 有效

                                        【讨论】:

                                          【解决方案27】:

                                          根据我自己的经验,无论何时包含布局,请确保根视图组具有如下所示的布局 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">
                                          

                                          【讨论】:

                                            猜你喜欢
                                            • 2015-12-25
                                            • 2018-05-24
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2013-08-03
                                            • 2013-03-23
                                            相关资源
                                            最近更新 更多