2

当我尝试使用数据绑定和绑定布局中的自定义 XML 标记运行项目时,出现以下构建错误:

布局:

<data>
   <variable
        name="data"
        type="com.melontech.sff.viewmodel.DataViewModel" />
</data> 

...

<ImageView 
   android:id="@+id/image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@mipmap/placeholder_img"
   app:imageUrl="@{data.imageUrl}" />

...

View Model 具有以下 Binding 适配器:

@BindingAdapter("bind:imageUrl")
public static void getImageUrl(ImageView imageView, String url) {
    Timber.d("LOAD IMAGE WITH URL %s", url);
}

创建 ViewHolder 并进行绑定的代码如下:

@Override
public ModelViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    ModelListItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.model_list_item, parent, false);
    return new ModelViewHolder(binding);
}

构建错误:

Error:Execution failed for task ':app:transformJackWithJackForDebug'.

com.android.jack.ir.JNodeInternalError: java.lang.Exception: java.lang.RuntimeException: 失败,详情请查看日志。无法生成视图活页夹 java.lang.IllegalArgumentException: element public default java.util.stream.IntStream codePoints() 不是包含类型 java.lang.String 的成员,也不是 com.android.jack.eclipse 的任何超类。 jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:129) 在 android.databinding.tool.reflection.annotation.AnnotationMethod.(AnnotationMethod.java:49) 在 android.databinding.tool.reflection.annotation .AnnotationClass.getDeclaredMethods(AnnotationClass.java:314) 在 android.databinding.tool.reflection.ModelClass.getAbstractMethods(ModelClass.java:401) 在 android.databinding.tool.expr.MethodBaseExpr.resolveListenersAsMethodReference(MethodBaseExpr.

在 Gradle 文件中启用了数据绑定。

如果我将这个功能移动到一个单独的干净项目中并像这样绑定数据:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

自定义 XML 属性按预期工作并且构建成功。

您有什么想法可能是构建错误的原因吗?

4

4 回答 4

5

我遇到了你遇到的同样的问题。但是我找到了绑定的解决方案,而不是直接调用 getImageUrl。

<ImageView 
   android:id="@+id/image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@mipmap/placeholder_img"
   app:imageUrl="@{data.imageUrl}" />
@BindingAdapter("bind:imageUrl")
public static void getImageUrl(ImageView imageView, Object url) {
    Timber.d("LOAD IMAGE WITH URL %s", (String) url);
}

使用对象而不是字符串。然后它将起作用。也许是绑定或插孔的错误。

于 2017-04-13T08:57:49.207 回答
1

试试这个方法...

@BindingAdapter("imageUrl")
public static void getImageUrl(ImageView imageView, String url) {
    Timber.d("LOAD IMAGE WITH URL %s", url);
}


<ImageView 
   android:id="@+id/image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@mipmap/placeholder_img"
   tools:imageUrl="@{data.imageUrl}" />
于 2017-03-27T12:55:24.417 回答
1

我认为您正在尝试使用Java 8功能并Data Binding一起使用。当你添加

 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

Jack Compiler

jackOptions {
            enabled true
        }

对于您的项目,您使用自定义属性收到此错误。

谷歌说:

根据此公告,不推荐使用 Jack 工具链。如果您的项目依赖于 Jack,您可以继续使用它。但是,它可能会在未来的 Android Studio 2.4 预览版中完全删除。因此,我们建议禁用 Jack 并使用 Android Studio 默认工具链中内置的 Java 8 支持。

这是官方文档: https ://developer.android.com/studio/preview/features/java8-support.html

如果您只是使用它,RetroLambda您可以像下面那样迁移它而不启用Jack.

buildscript {
  ...
   dependencies {
      // Remove the following dependency.
      classpath 'me.tatarka:gradle-retrolambda:<version_number>'
   }
}

在您的应用程序中:

apply plugin: 'me.tatarka.retrolambda'

第二种方式;-正如Seto提到的 - 你可以改变你Binding Adapter喜欢下面的代码:

@BindingAdapter("imageUrl")
public static void getImageUrl(ImageView imageView, Object url) {
    Timber.d("LOAD IMAGE WITH URL %s", (String)url);
}

这也对你有用。祝你好运。

于 2017-05-03T20:24:39.650 回答
0

Jd Prajapati这是我的 ViewModel 类:

public class DataViewModel {

   private Data data;

   public DataViewModel() {
   }

   public DataViewModel(Data data) {
       this.data = data;
   }

   public Data getData() {
       return data;
   }

   public void setData(Data data) {
       this.data = data;
   }

   public String getTitle() {
       if (data != null) {
           if (!TextUtils.isEmpty(data.getTitle())) {
               return data.getTitle();
           }
       }
       //Case when title doesn't exist
       return "";
   }

   public String getImageUrl() {
       if (data != null) {
           if (!TextUtils.isEmpty(data.getMainPic())) {
               return data.getMainPic();
           }
       }
       //Case when poster url doesn't exist
       return "";
   }

   @BindingAdapter("imageUrl")
   public static void getImageUrl(ImageView imageView, String url) {
        Timber.d("LOAD IMAGE WITH URL %s", url);
   }
}

顺便说一句,我找到了一种通过将 ImageView 属性更改为以下内容来使 Gradle 构建项目的方法:

<ImageView
   android:id="@+id/movie_poster"
   android:layout_width="@dimen/dim_160dp"
   android:layout_height="@dimen/dim_240dp"
   android:src="@mipmap/movie_placeholder_img"
   app:imageUrl="@{singleMovie.getImageUrl()}" />
于 2017-03-28T10:56:44.937 回答