升级到gradle 5.0后,Android数据绑定“虽然已注册但缺少导入表达式”

时间:2019-04-18 22:14:28

标签: android android-gradle android-databinding androidx

我将Android Studio升级到3.4之后,将Android Gradle插件升级到3.4并升级到5.1.1

我遇到如下数据绑定错误

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

此问题从未在升级之前发生

我可以确认是由于新的gradle更新

  

DataBinderMapperImpl.java:54:错误:找不到符号

     

e:[kapt]发生异常:android.databinding.tool.util.LoggedErrorException:找到了数据绑定   错误。   **** /数据绑定错误**** msg:虽然已注册但缺少导入表达式

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

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

3 个答案:

答案 0 :(得分:39)

升级Android Studio和gradle插件后,由于以下原因,我遇到了类似的问题。 我在布局文件中使用了<import type="java.lang.String" />。 删除此导入即可解决问题。

  

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

答案 1 :(得分:1)

我在数据绑定中也遇到这些错误。我尝试使用“ android.databinding.enableV2 = true”,但无法正常工作。重做layout.xml的数据绑定后,我找到了这些解决方案。 如果我在layout.xml中使用“ android.view.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。因此,我将Integer值转换为带有%d标签的strings.xml。

 <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" />

我希望这些可以解决您的问题。

答案 2 :(得分:0)

我假设您正在使用gradle插件版本3.4(而不是您所提到的4.3)。查看可用的gradle-plugin版本列表  https://developer.android.com/studio/releases/gradle-plugin#updating-gradle。数据绑定编译器选项https://developer.android.com/topic/libraries/data-binding/start#preview-compiler

有变化

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

android.databinding.enableV2=true