是否有人能够使用与GoogleServices pluginplugin并行的Android DataBinding插件?
dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'com.google.gms:google-services:1.4.0-beta3'
classpath 'com.android.databinding:dataBinder:1.0-rc1'
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.databinding'
Run Code Online (Sandbox Code Playgroud)
然后整个项目爆炸了.当我删除服务插件然后数据绑定工作.
这是gradle的堆栈跟踪.
[data binding plugin]: failed to setup data binding
java.lang.NoSuchMethodError: com.android.build.gradle.AppExtension.getApplicationVariants()Lorg/gradle/api/internal/DefaultDomainObjectSet;
at android.databinding.tool.DataBinderPlugin.createXmlProcessorForApp(DataBinderPlugin.java:233)
at android.databinding.tool.DataBinderPlugin.createXmlProcessor(DataBinderPlugin.java:200)
at android.databinding.tool.DataBinderPlugin.access$200(DataBinderPlugin.java:65)
at android.databinding.tool.DataBinderPlugin$1.execute(DataBinderPlugin.java:156)
at android.databinding.tool.DataBinderPlugin$1.execute(DataBinderPlugin.java:152)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:113)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:102)
at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:87)
at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:31)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy10.afterEvaluate(Unknown Source)
at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:488)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:86)
at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:82)
at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:75)
at org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42)
at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44)
at org.gradle.execution.DefaultBuildExecuter.configure(DefaultBuildExecuter.java:42)
at org.gradle.execution.DefaultBuildExecuter.access$100(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:48)
at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
at …Run Code Online (Sandbox Code Playgroud) android google-play-services android-gradle-plugin google-app-invites android-databinding
我正在玩谷歌的Android数据绑定库,我曾经在那里工作过.现在,似乎"某些东西"已经改变,它正在导致数据绑定库出现问题.我被一个非常通用的错误所困扰,这个错误证明难以调试,a [data binding plugin]: failed to setup data binding.
AFAIK,当数据绑定库与您的某个布局文件有问题时(例如绑定中的拼写错误),会抛出此错误.问题是,如何才能找到出其布局文件是造成问题的原因?有没有人有关于如何找出问题所在的任何提示/建议?如果没有一次评论XML布局代码和Java代码文件,我有点不知道如何有效地解决这些类型的问题.
我得到的唯一线索是Gradle控制台中这种非描述性的堆栈跟踪:
[data binding plugin]: failed to setup data binding
java.lang.NoSuchMethodError: android.databinding.tool.LayoutXmlProcessor.<init>(Ljava/lang/String;Ljava/util/List;Landroid/databinding/tool/writer/JavaFileWriter;IZ)V
at android.databinding.tool.DataBinderPlugin.attachXmlProcessor(DataBinderPlugin.java:274)
at android.databinding.tool.DataBinderPlugin.createXmlProcessorForApp(DataBinderPlugin.java:231)
at android.databinding.tool.DataBinderPlugin.createXmlProcessor(DataBinderPlugin.java:200)
at android.databinding.tool.DataBinderPlugin.access$200(DataBinderPlugin.java:65)
at android.databinding.tool.DataBinderPlugin$1.execute(DataBinderPlugin.java:156)
at android.databinding.tool.DataBinderPlugin$1.execute(DataBinderPlugin.java:152)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy10.afterEvaluate(Unknown Source)
at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:499)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:86)
at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:82)
at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:75)
at org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42)
at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44)
at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
at …Run Code Online (Sandbox Code Playgroud) 以下是Android数据绑定的典型用法:
android:background="@{isError ? @color/red : @color/white}"
Run Code Online (Sandbox Code Playgroud)
当州可以采用多个价值观时会变得更加困难.编辑:使用方法调用中的status属性是使其工作的唯一方法:
android:background="@{Check.getStatusColor(check.status)}"
Run Code Online (Sandbox Code Playgroud)
并定义静态方法(没有@Bindable):
public int getStatusColor(int status) {
switch (status.get()) {
case STATUS_OK:
return ContextCompat.getColor(context, R.color.success);
case STATUS_WARNING:
return ContextCompat.getColor(context, R.color.warning);
case STATUS_ERROR:
return ContextCompat.getColor(context, R.color.error);
default:
return ContextCompat.getColor(context, R.color.idle);
}
}
Run Code Online (Sandbox Code Playgroud)
如何在没有将嵌套的三元运算符放入XML(我没有发现非常优雅,顺便说一句)或不传递check.status属性的情况下实现这一点?
编辑:添加XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="org.honorato.diagnostics.models.Check"/>
<variable
name="check"
type="Check"/>
</data>
<LinearLayout
android:background="@android:color/white"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="72dp"
>
<LinearLayout
android:padding="16dp"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:text="@{check.title}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/primary_text_light"
android:textStyle="bold" />
</LinearLayout>
<ImageView
android:padding="16dp"
android:src="@{check.getStatusDrawable(check.status)}" …Run Code Online (Sandbox Code Playgroud) 我正在使用带有数据绑定库的Android应用程序的MVVM框架.
我有一些可重复使用的组件,应该包含所有活动.fe工具栏,菜单,浮动动作按钮.
我想创建一个通用活动,它将实现所有这些可重用的功能,然后每个活动类将从这个通用活动继承.我还有GenericViewModel类,并且每个其他ViewModel都继承自这个泛型类.
但我的布局有问题.我想创建通用布局文件,并在那里包含sublayout dinamically.FE
<?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">
<data>
<variable
name="data"
type="com.mypackage.genericViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
bind:data="@{data}"
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include
layout="@{Here i want to have dynamic variable}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout></layout>
Run Code Online (Sandbox Code Playgroud)
我不想为每个活动复制/粘贴此代码,但数据绑定库不允许动态包含布局.这种情况有解决方案吗?
每次当我尝试assemble调试应用程序的构建时,更新到gradle 2.10之后我得到了NoSuchMethodError异常.以下是构建日志的相关部分:
java.lang.RuntimeException: failure, see logs for details.
cannot generate view binders java.lang.NoSuchMethodError: com.google.common.base.Strings.isNullOrEmpty(Ljava/lang/String;)Z
at android.databinding.tool.util.StringUtils.capitalize(StringUtils.java:57)
at android.databinding.tool.util.ParserHelper.toClassName(ParserHelper.java:23)
at android.databinding.tool.store.ResourceBundle$LayoutFileBundle.getFullBindingClass(ResourceBundle.java:551)
at android.databinding.tool.store.ResourceBundle$LayoutFileBundle.getBindingClassPackage(ResourceBundle.java:541)
at android.databinding.tool.CompilerChef.pushClassesToAnalyzer(CompilerChef.java:124)
at android.databinding.tool.CompilerChef.createChef(CompilerChef.java:73)
at android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:148)
at android.databinding.annotationprocessor.ProcessExpressions.onHandleStep(ProcessExpressions.java:82)
at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.runStep(ProcessDataBinding.java:154)
at android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.access$000(ProcessDataBinding.java:139)
at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:66)
Run Code Online (Sandbox Code Playgroud)
如您所见,com.google.common.base.Strings.isNullOrEmpty无法找到Method .
一些细节
我使用Retrolambda 3.2.5和Java 8.没有其他额外的插件.
构建插件版本: com.android.tools.build:gradle:2.0.0
构建工具版本: 23.0.3
OS: OS X
build.gradle看起来像这样.我稍微改了一下,不露出一些私密的东西,但问题仍然存在.
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'me.tatarka:gradle-retrolambda:3.2.3'
}
}
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
project.version …Run Code Online (Sandbox Code Playgroud) 我设法结合微调器ArrayList的objects,现在我需要使它的是,当您选择微调的某些项目,它反映了ViewModel(setter方法被调用,并设置一个变量来选择什么指数是在转的值)
我设法让它以相反的方式工作,将值viewmodel反映到view(像这样如何使用带有Android微调器的DataBindingUtil?).
相关的xml
<data>
<variable
name="spinnerList"
type="com.example.root.proj.viewmodels.MonumentTypeVMList"/>
</data>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:spinnerbind="@{spinnerList.list}"
bind:selection="@{spinnerList.selection}"
></Spinner>
Run Code Online (Sandbox Code Playgroud)
自定义绑定
@BindingAdapter("bind:selection")
public static void bindSelection(Spinner spinner, int position) {
spinner.setSelection(position);
}
Run Code Online (Sandbox Code Playgroud) 是否可以使用Android绑定功能将setOnPageChangeListener的处理程序绑定到XML文件中的ViewPager?
演示显示onClick事件,但我很好奇我可以用它实现多少事件功能.关于数据绑定功能的任何链接也都很棒.谢谢.
假设的例子:
example_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.Handlers"/>
</data>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onPageChangeListener="@{handlers.pageChanged}" />
</layout>
Run Code Online (Sandbox Code Playgroud)
Handler.java
package com.example.viewmodels;
import android.view.View;
public class Handlers {
public void pageChanged(View view){}
}
Run Code Online (Sandbox Code Playgroud)
编译错误是:
错误:(62)在'android'包中找不到属性'onPageChangeListener'的资源标识符
我正在Android应用程序上运行Espresso测试.测试是片状的.它可以可靠地声明数据模型已更新.我的问题是ViewMatchers无法匹配View中的相同值,因为ViewDataBinding尚未更新Views.(至少大部分时间都是测试运行.)
当ViewDataBinding在视图上没有挂起的更改时,是否会出现IdlingResource这样的事情?
我的解决方法是调用executePendingBindings()和一个小的Thread.sleep(...)的组合.
android android-testing android-espresso android-databinding
我正在使用DataBinding库.当我将布局文件添加到项目中或将任何视图添加到布局文件中时,Android Studio无法为布局生成Binding类,直到重建项目为止.
布局文件:
<?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"
tools:context=".MainActivity">
<data>
<variable
name="viewModel"
type="com.qk365.thweeks.MainViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/main_tab"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@android:color/white"
android:elevation="5dp"
app:tabGravity="fill"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabSelectedTextColor="#7343ea"
app:tabTextAppearance="@style/TextAppearance.Design.Tab"
app:tabTextColor="#181818" />
<android.support.v4.view.ViewPager
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/main_tab">
</android.support.v4.view.ViewPager>
</RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
我检查了Android Studio日志,当布局文件发生变化时,总会有错误信息.
2018-04-17 11:20:01,699 [e-1024-b02] ERROR - .intellij.psi.impl.ElementBase - Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers: SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(5200996b); SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(398a3993)
invalidated at: see attachment
com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers: SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(5200996b); SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(398a3993) …Run Code Online (Sandbox Code Playgroud) Florina Muntenescu撰写了一篇关于<annotation>在字符串资源中使用能够拥有灵活标记的酷文章,您可以使用自定义跨度在应用程序中处理这些标记.我试图在数据绑定中利用它,但我无法弄清楚如何SpannedString从数据绑定中获取字符串资源的版本.
在我的布局中,我有app:thingy="@{@string/my_annotated_string}"一个属性TextView.我有一个绑定适配器设置来处理thingy属性.但是,数据绑定系统似乎坚持我的价值是String.
我试过了:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, thingy: SpannedString) { /* stuff goes here */ }
Run Code Online (Sandbox Code Playgroud)
和:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, thingy: Spanned) { /* stuff goes here */ }
Run Code Online (Sandbox Code Playgroud)
和:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, @StringRes thingy: Int) { /* stuff goes here */ }
Run Code Online (Sandbox Code Playgroud)
在所有情况下,我都会遇到Cannot find the setter for attribute 'app:thingy' with parameter type java.lang.String on android.widget.TextView构建错误. …