谷歌文档说,变量可以从包含布局传递到包含布局的绑定,但我无法使其工作,但是获取数据绑定错误****msg:标识符必须具有XML文件中的用户定义类型.处理程序缺少它.包含XML看起来像这样:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.example.FocusChangeHandler"/>
<variable
name="handler"
type="FocusChangeHandler"/>
</data>
<!-- Some other views --->
<include
android:id="@+id/inputs"
layout="@layout/input_fields"
bind:handler="@{handler}"/>
</layout>
Run Code Online (Sandbox Code Playgroud)
包含的XML就像这样:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
android:id="@+id/nameEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onFocusChange="@{handler.onFocusChange}"/>
</layout>
Run Code Online (Sandbox Code Playgroud)
我能够通过生成的绑定类引用包含布局的视图,但传递变量不起作用.
我正在将我的Android应用程序从Java转换为Kotlin.它正常工作,除非我尝试转换使用Android数据绑定库的文件.在这种情况下,Android Studio会在编译时抱怨未解析的引用:
Error:(10, 44) Unresolved reference: AdapterHistoriesListBinding
Run Code Online (Sandbox Code Playgroud)
AdapterHistoriesListBinding应该由数据绑定库生成的文件的名称在哪里.它在Java中正常工作,所以我猜这是Kotlin的一个问题.
我使用的是Android Studio 2.0.0-beta6,Android Gradle Plugin 2.0.0-beta6和Kotlin 1.0.有没有什么可以使数据绑定库与Kotlin一起工作?
在android studio 2.1中,来自xml错误的编译时错误消息完全没有帮助:
Error:(11, 41) error: package mypackage.databinding does not exist
Error:(15, 13) error: cannot find symbol class MyActivityBinding
Run Code Online (Sandbox Code Playgroud)
真正的错误通常是"没有这样的属性android:adapter",或"变量foo不包含属性栏"或类似的东西.但是它没有实际显示这样的错误,而是显示了上面那些无用的错误,它们只告诉你由于某些未知错误而没有生成绑定.
DataBinding在我的项目中运行得非常好,但是在今天升级Android Studio 2.3之后.运行'app'失败,因为以下错误:
Error:(15, 40) Error: package com.javan.myrecorder.databinding not exist.
import com.javan.myrecorder.databinding.FragmentEventsBinding;
:app:compileMockDebugJavaWithJavac FAILED
Run Code Online (Sandbox Code Playgroud)
我只是升级android studio并没有改变任何东西.所有插件都是最新的!现在我的问题是,为什么会发生这个错误,我怎么能解决它?欢迎任何帮助!
英语不是我的母语; 请原谅我的任何错误.
EDIT1
像android项目googlesamples/android-architecture
git checkout todo-databinding ./gradlew assembleDebug构建,构建因以下错误而失败:EDIT2 我已经修复了这个问题,因为在升级到Gradle 2.3之后,数据绑定已经破坏了.
在build.gradle(app)加
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
..balabala
dependencies {
apt 'com.android.databinding:compiler:2.3.0'
}
Run Code Online (Sandbox Code Playgroud)
我项目中的一些文件:
gradle-wrapper.properties
#Mon Mar 06 10:59:04 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
Run Code Online (Sandbox Code Playgroud)
@petrnohejl @George Mount @ Sa-Zad Prasla,谢谢!
data-binding android android-studio android-databinding android-studio-2.3
有几次,为了解决问题或更新依赖项,我必须启用给定的gradle选项设置.
例如,Robolectric 4.0迁移指南指出:
把它放在你的gradle.properties中:
android.enableUnitTestBinaryResources=true
同样,为了调试数据绑定编译错误,我遵循Gradle的构建日志中打印的建议:
Gradle可能会禁用渐进式编译[...].
考虑android.enableSeparateAnnotationProcessing=true在gradle.properties文件中设置实验性功能标志,以在单独的任务中运行注释处理并进行增量编译.
从这两个例子中,我得知作者(Robolectric/gradle维护者)确信启用此选项将对每种情况产生积极影响.
但是,在这两种情况下,我都会在构建输出中收到此警告:
警告:选项设置'android.enableUnitTestBinaryResources = true'是实验性的,不受支持.当前默认值为"false".
警告:选项设置'android.enableSeparateAnnotationProcessing = true'是实验性的,不受支持.当前默认值为"false".
那gradle.properties几个月以来我的旗帜已经存在了android.databinding.enableV2=true.为了看看它是如何处理的,我试着把它放到false,它带来了相同的The option setting 'android.databinding.enableV2=false' is experimental and unsupported.警告(这似乎表明unsupported设置被忽略).
我一直在开发一个带有数据绑定和MVVM的应用程序.
我正试图在横向模式下为我的应用程序使用替代布局.我有:
layout/fragment_content.xml
layout-land/fragment_content.xml
Run Code Online (Sandbox Code Playgroud)
两种布局都具有不同外观的相同视图,并从相同的视图模型获取提要,如下所示:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data class="MyBinding">
<variable
name="viewModel"
type="com.myapp.package.viewModel.VMFirst"/>
<variable
name="controlModel"
type="com.myapp.package.viewModel.VMSecond"/>
</data>
<DIFFERENT CONTENT HERE>
Run Code Online (Sandbox Code Playgroud)
两种布局都存在所有视图和id.
好吧,问题是,它不编译,错误只是"cannot find symbol method getViewModel"和另一个变量的getter.
到目前为止我尝试了什么:
使用布局和布局 - 土地文件夹(失败,错误在上面解释)
使用布局别名使用我在此处找到的布局别名问题199344:数据绑定不适用于布局别名.尝试这种方法时,我没有更改xml文件中的任何内容.这也失败了,错误是Could not write to com.myapp.package.databinding.MyBinding
是否无法data在多个布局文件中使用数据绑定标记?在使用数据绑定时,我应该使用什么来为不同的状态使用不同的布局?谢谢 !
编辑:删除class="MyBinding"没有更改错误.
我一直试图使用android数据绑定中的隐式属性监听器(引用)来控制视图的可见性,它允许通过id和访问属性(如checked,visible等)访问视图,但是当尝试使用它时,它会抛出像这样的错误
Error:(119, 29) Identifiers must have user defined types from the XML file. addTodo_switch_remind is missing it
Run Code Online (Sandbox Code Playgroud)
<android.support.v7.widget.SwitchCompat
android:id="@+id/addTodo_switch_remind"
style="@style/MediumTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/addTodo_space_project"
android:text="@string/add_todo_remind_label"
android:textOff="@string/generic_no_text"
android:textOn="@string/generic_yes_text" />
<android.support.v4.widget.Space
android:id="@+id/addTodo_space_remind"
style="@style/FormsSpacingStyle"
android:layout_below="@+id/addTodo_switch_remind" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/addTodo_space_remind"
android:orientation="vertical"
android:padding="@dimen/grid_box_single"
android:visibility="@{addTodo_switch_remind.checked ? View.VISIBLE : View.GONE}">
Run Code Online (Sandbox Code Playgroud) 如何定义数据绑定变量的泛型类型?
以下代码永远不会编译.
<data>
<variable
name="viewModel"
type="com.example.viewmodel.ViewModel<Model>"/>
</data>
Run Code Online (Sandbox Code Playgroud) 当我尝试为我的kotlin android项目设置单元测试时,我遇到了以下错误.以前有人遇到过这种问题吗?
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:compileDebugUnitTestJavaWithJavac'.
> java.lang.RuntimeException: Failed to parse data binding compiler options. Params:
kapt.annotations : /Users/trevor/Dev/Android/workspace/gitlab-example/app/build/tmp/kapt/debugUnitTest/wrappers/annotations.debugUnitTest.txt
kapt.kotlin.generated : /Users/trevor/Dev/Android/workspace/gitlab-example/app/build/tmp/kapt/debugUnitTest/kotlinGenerated
* Try:
Run with --info or --debug option to get more log output.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugUnitTestJavaWithJavac'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
at … data-binding android unit-testing kotlin android-databinding
我开发了基于android数据绑定库的应用程序:https://developer.android.com/topic/libraries/data-binding/index.html
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用新库中的ViewModelProviders:https: //developer.android.com/topic/libraries/architecture/guide.html
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
Run Code Online (Sandbox Code Playgroud)
它如何结合?任何的想法?或者应该结合这两个库?
编辑
我改为:
class SignInViewModel extends ViewModel {
public ObservableField<String> login = new ObservableField<>("");
public ObservableField<String> password = new ObservableField<>("");
}
Run Code Online (Sandbox Code Playgroud)
现在编译,但问题是:它是正确的方式?