【问题标题】:Data Binding broke after upgrade to Gradle 2.3升级到 Gradle 2.3 后数据绑定中断
【发布时间】:2017-07-23 01:56:54
【问题描述】:

升级到 Gradle 2.3 后。我的项目无法编译。我在控制台中有日志

incompatible types: ObservableInt cannot be converted to 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"
/>

我在绑定类中尝试了方法

@BindingAdapter("app:visibility")
public static void setViewVisible(View view, ObservableInt visible) {
        int visibility = visible.get();
        view.setVisibility(visibility);
}

得到日志

警告:属性 app:visibility 的应用程序命名空间将被忽略。

public static void setViewVisible(View view, ObservableInt visible) {

警告:直接使用 ObservableField 和原始表亲作为方法参数已被弃用,支持将很快被删除。在方法 public static void setViewVisible(android.view.View,android.databinding.ObservableInt) 中使用内容作为参数

public static void setViewVisible(View view, ObservableInt visible) {

有人遇到过吗?

【问题讨论】:

    标签: android android-gradle-plugin android-databinding


    【解决方案1】:

    这看起来像一个错误。请归档。有很多测试,我们不希望出现这种回归。获取您的具体示例非常重要,这样我们才能确保它被捕获。

    您现在可以忽略警告。

    第一个是因为这个原因造成的:

    @BindingAdapter("app:visibility")
    

    你应该改用这个:

    @BindingAdapter("visibility")
    

    第二个是因为我们支持ObservableInt作为参数。您通常不想接受ObservableInt,而是接受int。我很乐意看到需要ObservableInt 的用例。我们可能会删除该警告并始终支持它,或者如果没有有效用途,我们可能会取消支持 ObservableInt 作为参数。

    ----- 编辑-----

    我用一个小应用程序对此进行了测试,没有任何 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>
    

    这是我的模型:

    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);
        }
    }
    

    即使我使用带有 ObservableInt 的 BindingAdapter,它仍然有效。这是我的 BindingAdapter:

    @BindingAdapter("visiblity")
    public static void setVisibility(View view, ObservableInt visibility) {
        view.setVisibility(visibility.get());
    }
    

    我将视图的绑定更改为:

        <TextView ...
                app:visibility="@{model.visibility}"
        />
    

    你的viewModel有什么不同吗?

    【讨论】:

    • 我确实尝试过@BindingAdapter("visibility"),但没有成功。我正在使用数据绑定和 MVVM 模式来控制视图状态。例如发生错误,ErrorView 显示; ContentView 隐藏。这意味着 ObservableInt errorViewVisibility.set(View.VISIBLE)ObservableInt contentViewVisibility.set(View.GONE)。我在 Gradle 2.2.3 上一切正常,然后在 2.3 上停止。
    • 你试过 BindingAdapter("android: visibility") 吗?
    • 另外,我假设您还升级了 gradle 插件行:classpath com.android.tools.build:gradle:2.3.0
    • 是的,还有 Android Studio
    • 我在 BindingAdapter 中使用 ObservableBoolean 时遇到了同样的警告。当我遇到这个线程时,我更改了绑定表达式和适配器以传递包含的布尔值。但这会导致一个新的警告:警告:不要在表达式中显式调用 ObservasbleFields 上的 'get()'。此支持将很快被删除。 'viewModel.name.valid.get()' 解决这些弃用警告的正确方法是什么?
    【解决方案2】:

    您只需将其添加到 build.gradle 依赖项的底部即可:

    apt 'com.android.databinding:compiler:2.3.0'
    

    【讨论】:

    • 我试过了,但它给了我一个编译错误“找不到 Gradle DSL 方法:'apt()'”
    • @DanPonce 尝试使用 annotationProcessor 而不是 apt(如果您使用 Kotlin,请使用 kapt),因为不推荐使用 android-apt。我回答了另一个问题here
    【解决方案3】:

    请参阅:https://stackoverflow.com/a/42711830/376829 关于 GoMobile 更新到版本“+eb90329 Mar 7 2017”和 GoBind 插件恢复到版本“0.2.6”(尽管当前版本是“0.2.8”)

    【讨论】:

      【解决方案4】:
       android:visibility="@{viewModel.contentVisibility}" 
      

      记住这一点

      dataBinding {
          enabled = true
      }
      

      从 Android SDK 管理器的支持存储库中重新下载库。

      【讨论】:

      • 还是没有占上风?
      • 您的答案在这种情况下不起作用。数据绑定已启用
      • “重新下载库”拯救了我的一天!
      猜你喜欢
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多