Android 升级到Gradle 2.3后数据绑定中断
升级到Gradle 2.3后。我的项目无法编译。我把日志放在控制台里了Android 升级到Gradle 2.3后数据绑定中断,android,android-gradle-plugin,android-databinding,Android,Android Gradle Plugin,Android Databinding,升级到Gradle 2.3后。我的项目无法编译。我把日志放在控制台里了 不兼容类型:ObserveInt无法转换为int 查看生成的文件 android.databinding.ObservableInt viewModelLoadingVisibility; this.vLoading.getRoot().setVisibility(viewModelLoadingVisibility); 在xml文件中 <android.support.v7.widget.RecyclerView
不兼容类型:ObserveInt无法转换为int
查看生成的文件
android.databinding.ObservableInt viewModelLoadingVisibility;
this.vLoading.getRoot().setVisibility(viewModelLoadingVisibility);
在xml
文件中
<android.support.v7.widget.RecyclerView
android:id="@+id/rvProducts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:visibility="@{viewModel.contentVisibility}"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
并且得到了日志
警告:属性app:可见性的应用程序命名空间将被忽略
警告:不推荐将ObservaleField和primitive cousins直接用作方法参数,支持很快将被删除。在方法publicstaticvoidsetviewvisible(android.view.view,android.databinding.observeInt)中将内容用作参数
有人遇到过这个吗
android:visibility="@{viewModel.contentVisibility}"
记住这一点
dataBinding {
enabled = true
}
从Android SDK管理器中的支持存储库重新下载该库。您只需将其添加到构建的底部即可。gradle依赖项:
apt 'com.android.databinding:compiler:2.3.0'
这看起来像个虫子。请归档。有很多测试,我们不希望出现这种回归。重要的是,我们得到你的具体例子,这样我们就可以确保它被捕获 您现在可以忽略这些警告 第一个原因是:
@BindingAdapter("app:visibility")
您应该改为使用此选项:
@BindingAdapter("visibility")
第二个原因是我们支持observativent
作为参数。您通常不希望接受observativeint
,而是希望接受int
。我希望看到有必要使用observativent
的用例。我们可以删除该警告并始终支持它,或者如果没有有效的用途,我们可以将支持observateInt
作为参数
-----编辑-----
我用一个小应用程序对此进行了测试,没有任何BindingAdapter,我没有任何问题。布局如下:
<layout>
<data>
<variable name="model" type="com.example.gmount.testobservableint.MyModel"/>
</data>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{model::clicked}"
tools:context="com.example.gmount.testobservableint.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="@{model.visibility}"
/>
</android.support.constraint.ConstraintLayout>
</layout>
即使我使用BindingAdapter获取ObservaleInt,它也能工作。以下是我的BindingAdapter:
@BindingAdapter("visiblity")
public static void setVisibility(View view, ObservableInt visibility) {
view.setVisibility(visibility.get());
}
我将视图的绑定更改为:
<TextView ...
app:visibility="@{model.visibility}"
/>
您的
视图模型有什么不同吗?请看:关于GoMobile更新到版本“+eb90329 Mar 7 2017”和GoBind插件恢复到版本“0.2.6”(尽管当前版本是“0.2.8”)仍然没有成功?您的答案在这种情况下不起作用。数据绑定已启用“重新下载库”保存了我的一天!我尝试了这个方法,但它给了我一个编译错误“Gradle DSL method not found:'apt()”@DanPonce尝试使用annotationProcessor
而不是apt
(或者使用kapt
,如果您使用的是Kotlin),因为android apt
已被弃用。我回答了另一个问题。我尝试了@BindingAdapter(“可见性”)
,但没有成功。我使用数据绑定和MVVM模式来控制视图状态。例如,发生错误时,ErrorView
显示;ContentView
隐藏。它意味着一个可观察对象
错误视图可见性.set(View.VISIBLE)
,和一个可观察对象
内容视图可见性.set(View.GONE)
。我在Gradle 2.2.3上一切正常,然后在2.3上停止。你试过BindingAdapter(“android:visibility”)吗?另外,我假设你也升级了你的Gradle插件行:classpath com.android.tools.build:Gradle:2.3.0
Yes,以及android StudioI在BindingAdapter中使用ObservableBolean遇到了相同的警告。当我遇到这个线程时,我更改了绑定表达式和适配器以传递包含的布尔值。但这会产生一个新的警告:警告:不要对表达式中的ObservasbleFields显式调用“get()”。这种支持很快就会被取消。”viewModel.name.valid.get()'解决这些弃用警告的正确方法是什么?
<layout>
<data>
<variable name="model" type="com.example.gmount.testobservableint.MyModel"/>
</data>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{model::clicked}"
tools:context="com.example.gmount.testobservableint.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="@{model.visibility}"
/>
</android.support.constraint.ConstraintLayout>
</layout>
public class MyModel {
public final ObservableInt visibility = new ObservableInt(View.VISIBLE);
public void clicked(View view) {
int oldVisibility = visibility.get();
int newVisibility = oldVisibility == View.VISIBLE ? View.GONE : View.VISIBLE;
visibility.set(newVisibility);
}
}
@BindingAdapter("visiblity")
public static void setVisibility(View view, ObservableInt visibility) {
view.setVisibility(visibility.get());
}
<TextView ...
app:visibility="@{model.visibility}"
/>