使用自定义XML标记和数据绑定构建不成功的Gradle

Ste*_*hev 1 data-binding android gradle android-custom-attributes android-databinding

当我尝试使用数据绑定和绑定布局中的自定义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}" />

...
Run Code Online (Sandbox Code Playgroud)

View Model具有以下Binding适配器:

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

创建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);
}
Run Code Online (Sandbox Code Playgroud)

构建错误:

Error:Execution failed for task ':app:transformJackWithJackForDebug'.
Run Code Online (Sandbox Code Playgroud)

com.android.jack.ir.JNodeInternalError:java.lang.Exception:java.lang.RuntimeException:failure,请参阅日志以获取详细信息.无法生成视图绑定器java.lang.IllegalArgumentException:element public default java.util.stream.IntStream codePoints()不是包含类型java.lang.String的成员,也不是com.android.jack.eclipse中的任何超类.位于android.databinding.tool.reflection.annotation的android.databinding.tool.reflection.annotation.AnnotationMethod.(AnnotationMethod.java:49)中的jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:129) .AnnotationClass.getDeclaredMethods(AnnotationClass.java:314)位于android.databinding.tool.exol.exol.MethodBaseExpr.resolveListenersAsMethodReference(MethodBaseExpr.java:71)的android.databinding.tool.reflection.ModelClass.getAbstractMethods(ModelClass.java:401)在android.databinding.tool.BindingTarget.resolveListeners(BindingTarget.java)的android.databinding.tool.Binding.resolveListeners(Binding.java:65)的android.databinding.tool.expr.FieldAccessExpr.resolveListeners(FieldAccessExpr.java:131): 164)在android.databinding.tool.LayoutBinder.(LayoutBinder.java:250)位于android.databinding.tool.DataBinder上的android.databinding.tool.DataBinder.(DataBinder.java:52)android.databinding.tool.CompilerChef.ensureDataBinder(CompilerChef.java:88) (CompilerChef.java:187)在android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:184)在android.databinding.annotationprocessor.ProcessExpressions.onHandleStep(ProcessExpressions.java:86)在android.databinding.annotationprocessor.ProcessDataBinding $ ProcessingStep.runStep(ProcessDataBinding.java:189)位于android的DB.databprocess.Arocessprocess.ProcessDataBinding $ ProcessingStep.access $ 000(ProcessDataBinding.java:174),位于com的android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:79). com.android.jack.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatc)中的android.jack.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:139)her.java:121)位于com.android.jack.eclipse.jdt.internal.compiler的com.android.jack.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159). Comiler.processAnnotations(Compiler.java:909)位于com.android.jack.frontend.java.JAstBuilder.compile的com.android.jack.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:434) JAstBuilder.java:269)com.android.jack.frontend.java.JackBatchCompiler.performCompilation(JackBatchCompiler.java:219)at com.android.jack.eclipse.jdt.internal.compiler.batch.Main.compile(Main. java:1712)com.android.jack.frontend.java.JackBatchCompiler.compile(JackBatchCompiler.java:184)at com.android.jack.Jack.buildSession(Jack.java:1052)at com.android.jack.Jack .run(Jack.java:540)com.android.jack.api.v01.impl.Api01ConfigImpl $ Api01CompilationTaskImpl.run(Api01ConfigImpl.java:124)at com.android.builder.core.JackToolchain.convertUsingJackApis(JackToolchain.java) :310)在com.andro id.builder.core.JackToolchain.convertUsingApis(JackToolchain.java:189)com.android.builder.core.JackToolchain.convert(JackToolchain.java:170)at com.android.build.gradle.internal.transforms.JackTransform. runJack(JackTransform.java:230)at com.android.build.internal.transforms.JackTransform.transform(JackTransform.java:198)at com.android.build.gradle.internal.pipeline.TransformTask $ 2.call(TransformTask .java:185)在com.android.build.gradle.internal.pipeline.TransformTask $ 2.call(TransformTask.java:181)com的com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) .android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:176)在sun.reflect.GeneratedMethodAccessor311.invoke(未知来源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java的位于org.gradle.api.internal.project.t的org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)的.lang.reflect.Method.invoke(Method.java:498)在org.gradle.api.internal.project的org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore $ StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)中的askfactory.DefaultTaskClassInfoStore $ IncrementalTask​​Action.doExecute(DefaultTaskClassInfoStore.java:163). taskfactory.DefaultTaskClassInfoStore $ StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)at org.gradle.api.internal.tasks.execution.在org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute的org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)上的ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76) SkipUpToDateTaskExecuter.java:62)在org.gradle.api.api.api上,org.gradle.api.内部.执行任务时,执行org.gradle.api.api.api.执行命令(ValidatingTaskExecuter.java:58).SkipEmpty SourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute( SkipTaskWithNoActionsExecuter.java:51)org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java: 43)org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)org.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker $ 1.execute(DefaultTaskGraphExecuter.java:236)at org. gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker $ 1.execute(DefaultTaskGraphExecuter.java:228)org.gradle.internal.Transformers $ 4.transform(Transformers.java:169)org.gr adle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker.execute( DefaultTaskGraphExecuter.java:228)org.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor $ TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)at org .gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor $ TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute (DefaultTaskGraphExecuter.java:113)org.gradl上的org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)e.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)org.gradle.execution.DefaultBuildExecuter.access $ 000(DefaultBuildExecuter.java:23)org.gradle.execution.DefaultBuildExecuter $ 1.proceed(DefaultBuildExecuter.java:43) org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30) )维持在org.gradle.internal.Transformers $ 4.transform(变形金刚org.gradle.initialization.DefaultGradleLauncher $ 3.execute(DefaultGradleLauncher.java:196)在org.gradle.initialization.DefaultGradleLauncher $ 3.execute(DefaultGradleLauncher.java:193)的.java:169)在org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)在org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)在org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)atg.gradle.launcher .exec.GradleBuildController.run(GradleBuildController.java:71)位于org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner)的org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50) .java:35)在org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner $ 1.execute(RunAsBuildOperationBuildActionRunner.java:43)org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner $ 1.execute(RunAsBuildOperationBuildActionRunner.java) :40)在org.gradle上的org.gradle.internal.Transformers $ 4.transform(Transformers.java:169)org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106).internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)位于org.gradle.tooling.internal.provider.runner的org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40) .subscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:75)org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)at at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)位于org.gradle.tooling.internal.provider的org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75).在Org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)中的ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49))org.gradle中的org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67).在org.gradle.launcher.daemon的org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)上的launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36). server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)位于org.gradle.launcher.daemon.server.exec的org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120). ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)在org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)在org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute( RequestStopIfSingleUsedDaemon.java:34)org.gradle.launcher.daemon.server.api.DaemonCommandE xecution.proceed(DaemonCommandExecution.java:120)org.gradle.launcher.daemon.server.exe.ForwardClientInput $ 2.call(ForwardClientInput.java:74)org.gradle.launcher.daemon.server.exec.ForwardClientInput $ 2. org.gradle.util.Swapper.swap(Swapper.java:38)在org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)的org上调用(ForwardClientInput.java:72) .gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)位于org.gradle.launcher的org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55) org.gradle.launcher.daemon.server上的org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)中的.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)位于org.gradle.launcher.dae的org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)的.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)mon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)位于org.gradle.launcher.daemon.server的org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36). api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)atg.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy $ 1.run(StartBuildOrRespondWithBusy.java:50)org.gradle.launcher.daemon.server.DaemonStateCoordinator $ 1.运行(DaemonStateCoordinator.java:297)在org.gradle.internal.concurrent.ExecutorPolicy $ CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)在org.gradle.internal.concurrent.StoppableExecutorImpl $ 1.run(StoppableExecutorImpl.java:40)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)java.lang.Thread.run(Thread.java:745)

Gradle文件中启用了数据绑定.

如果我在单独的干净项目中移动此功能并绑定如下数据:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Run Code Online (Sandbox Code Playgroud)

自定义XML属性的工作方式与预期相同,构建成功.

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

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

使用Object而不是String.然后它会工作.也许这是绑定或杰克的错误.