Android 数据绑定 "Missing import expression although it is registered" 升级到 gradle 5.0 后

Android data binding "Missing import expression although it is registered" after upgrade to gradle 5.0

在我将 Android studio 升级到 3.4 后,Android Gradle 插件升级到 3.4,gradle 升级到 5.1.1

我遇到如下数据绑定错误

我已确保清理项目并重建,我已清除缓存并重新启动 AS。

升级前从未出现过此问题

我可以确认这是因为新的 gradle 更新

DataBinderMapperImpl.java:54: error: cannot find symbol

e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:Missing import expression although it is registered

我找到了解决方案: 解决方案:

  1. 现已发布3.4.1,请使用3.4.1
  2. 删除布局中的所有导入类型XML
  3. 从布局中的导入类型中删除所有字符串XML
  4. 从布局中的导入类型中删除所有整数XML

我假设您使用的是 gradle 插件版本 3.4(不是您提到的 4.3)。查看可用列表 gradle-插件版本 https://developer.android.com/studio/releases/gradle-plugin#updating-gradle. There is change in data binding compiler option https://developer.android.com/topic/libraries/data-binding/start#preview-compiler

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

android.databinding.enableV2=true

我在数据绑定中也遇到了这些错误。我尝试使用 'android.databinding.enableV2=true',它不起作用。在我为 layout.xml 重做数据绑定后,我找到了这些解决方案。 如果我在 layout.xml 中使用 'android.view.View',我会像这样导入视图并声明变量,

<data>
    <import type="java.util.List" />        
    <import type="android.view.View" />
    <import type="com.example.android.mobilepos.data.pojos.ActionData" />
    <variable
        name="view"
        type="View" />
    <variable  name="actionList"  type="java.util.List&lt;com.example.android.mobilepos.data.pojos.ActionData>" />

并像这样使用变量视图。

 <EditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" 
   android:id="@+id/txt_payment_remark"                           
   android:hint="@string/hint_payment_remark"                            
   android:visibility="@{switch1.checked ? view.VISIBLE : view.GONE}" />
 <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/action_data_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/color_white"
                android:focusable="true"
                android:clickable="true"
                app:actionSource="@{actionList}"
              app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"                    app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
                tools:context=".ui.fragments.NewInvoiceFragment"
                tools:listitem="@layout/fragment_new_invoice">

我也为 Integer.toString() 功能做了这样的工作,但无法在 layout.xml 中导入和使用 Integer。所以我将整数值转移到 strings.xml with %d label.

 <EditText
     android:id="@+id/txt_qty"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"                        
     android:hint="@string/hint_quantity"
     android:inputType="number"
     android:maxLength="5"
     android:maxLines="1"
     android:singleLine="true"
     android:text="@{@string/shipment_qty(product.qty)}"
     android:textAlignment="center"
     android:textColor="@color/black"
     android:textStyle="bold"                        
     tools:text="1000" />

希望这些能解决您的问题。

在我升级​​我的 Android 工作室和 gradle 插件后,我 运行 由于以下行而陷入类似的问题。 我在我的布局文件中使用了这个 <import type="java.lang.String" />。 删除此导入解决了问题。

Just as in managed code, java.lang.* is imported automatically.