Android 升级到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

升级到Gradle 2.3后。我的项目无法编译。我把日志放在控制台里了

不兼容类型: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}"
    />