找不到属性app:visibleGone的设置器

时间:2018-11-05 19:32:27

标签: android mvvm kotlin android-databinding

我正在尝试在我的android应用程序中实现MVVM体系结构。我也用Kotlin。

这是我的绑定适配器类:

(X**2).sum()

这是我的XML文件:

class BindingAdapter {
    companion object {
        @JvmStatic @BindingAdapter("app:visibleGone") fun showHide(view: View, show: Boolean) {
            view.visibility =
                    if (show)
                        View.VISIBLE
                    else
                        View.GONE
        }
    }
}

错误消息显示:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
                name="isLoading"
                type="boolean"/>
    </data>

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/cardview_light_background"
            android:orientation="vertical">

        <TextView
                android:id="@+id/loading_rates"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center_vertical|center_horizontal"
                android:text="@string/loading_rates"
                android:textAlignment="center"
                app:visibleGone="@{isLoading}"/>

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/cardview_light_background"
                android:orientation="vertical"
                app:visibleGone="@{!isLoading}">

            <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="20dp"
                    android:layout_marginTop="20dp"
                    android:gravity="center_horizontal"
                    android:text="@string/rate_list"
                    android:textAlignment="center"
                    android:textSize="@dimen/rate_text"
                    android:textStyle="bold"/>

            <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rate_list"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    app:layoutManager="LinearLayoutManager"/>

        </LinearLayout>

    </LinearLayout>
</layout>

第23行解析为app:visibleGone语句上方的loading_rates TextView行

我无法理解,尽管在Kotlin类中设置了BindingAdapter,但为什么我不能成功编译代码?

4 个答案:

答案 0 :(得分:3)

要解决该问题,请检查以下内容:

在root build.gradle中,您拥有

buildscript {
    ext.android_plugin_version = '3.1.2'
    dependencies {
        classpath "com.android.tools.build:gradle:$android_plugin_version"
    }
}

在app / build.gradle中

apply plugin: 'kotlin-kapt'
dependencies {
    ...
    kapt "com.android.databinding:compiler:$android_plugin_version"
}

有了所有这些东西,问题就应该消失了,您可以为基类编写@BindingAdapter并将其应用于该基类的子代。

答案 1 :(得分:1)

您可以做的是尝试在xml本身中隐藏和显示视图,    您不需要单独的绑定适配器。我希望这是您的问题。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <data>
       <import type="android.view.View" />

       <variable
            name="isLoading"
            type="boolean"/>
  </data>

    <TextView
            android:id="@+id/loading_rates"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/loading_rates"
            android:textAlignment="center"
            android:visibility="@{isLoading?View.VISIBLE:View.GONE}"/>

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/cardview_light_background"
            android:orientation="vertical"
            android:visibility="@{isLoading?View.GONE:View.VISIBLE}">
 <layout>

答案 2 :(得分:0)

您是否可以尝试在app:批注中不添加前缀BindingAdapter并更改您的第一个参数类型:

@JvmStatic
@BindingAdapter("visibleGone")
fun showHide(view: TextView, show: Boolean) {
   view.visibility = if (show) View.VISIBLE else View.GONE
}

答案 3 :(得分:0)

在尝试任何复杂的解决方案之前,只需验证您已在app.gradle中应用了以下插件

apply plugin: 'kotlin-kapt'

如果丢失,它将继续给出错误。在经过8个小时的争吵并阅读了其他SOF帖子后,我发现我的这个缺失。 有效。

添加图片以供参考:

Adding picture for reference