标签: android-databinding

使用与GoogleServices插件并行的Android DataBinding插件

是否有人能够使用与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

11
推荐指数
1
解决办法
1148
查看次数

Android数据绑定构建错误:[数据绑定插件]:无法设置数据绑定

我正在玩谷歌的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-databinding

11
推荐指数
3
解决办法
4959
查看次数

Android数据绑定条件资源

以下是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 android-databinding

11
推荐指数
1
解决办法
4476
查看次数

Android包含数据绑定库动态布局

我正在使用带有数据绑定库的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)

我不想为每个活动复制/粘贴此代码,但数据绑定库不允许动态包含布局.这种情况有解决方案吗?

android mvvm android-databinding

11
推荐指数
1
解决办法
3545
查看次数

数据绑定因NoSuchMethodError而失败

每次当我尝试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)

android android-gradle-plugin android-databinding

11
推荐指数
1
解决办法
774
查看次数

如何将spinner选中的值绑定到arraylist中的值

我设法结合微调器ArrayListobjects,现在我需要使它的是,当您选择微调的某些项目,它反映了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 android-databinding

11
推荐指数
3
解决办法
2万
查看次数

ViewPager的Android事件监听器数据绑定

是否可以使用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 android-viewpager android-databinding

11
推荐指数
2
解决办法
7217
查看次数

如何使Espresso等到Data Binding使用数据模型更新View?

我正在Android应用程序上运行Espresso测试.测试是片状的.它可以可靠地声明数据模型已更新.我的问题是ViewMatchers无法匹配View中的相同值,因为ViewDataBinding尚未更新Views.(至少大部分时间都是测试运行.)

当ViewDataBinding在视图上没有挂起的更改时,是否会出现IdlingResource这样的事情?

我的解决方法是调用executePendingBindings()和一个小的Thread.sleep(...)的组合.

android android-testing android-espresso android-databinding

11
推荐指数
2
解决办法
2113
查看次数

使用DataBinding时,Android Studio无法生成Binding类

  • Android Studio:3.1.0,3.1.1
  • Gradle:4.4
  • 构建工具:3.1.0

我正在使用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)

android-studio android-databinding

11
推荐指数
2
解决办法
3843
查看次数

我们如何使用数据绑定从字符串资源中获取SpannedString对象?

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构建错误. …

android android-resources android-databinding

11
推荐指数
1
解决办法
367
查看次数