我正在尝试在我的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,但为什么我不能成功编译代码?
答案 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)