我已经在Fragment
内部使绑定适配器静态可用,这基本上将我的按钮外观从“停止”更改为“播放”,反之亦然。
companion object {
@BindingAdapter("playState")
fun Button.setPlayState(item: UIState) {
item.let {
if (it.isPlaying) {
setText("Stop")
setBackgroundColor(ContextCompat.getColor(context, R.color.colorStop))
} else {
setText("Play")
setBackgroundColor(ContextCompat.getColor(context, R.color.colorPlay))
}
}
}
}
这是我的布局文件。我已经为其提供了数据类。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<!-- stuff here -->
<variable
name="viewmodel"
type="com.mypackage.ui.ViewModel"/>
<variable
name="uistate"
type="com.mypackage.ui.UIState" />
</data>
<!-- layout, buttons, and more stuff here. Just pay attention to this following button -->
<Button
android:id="@+id/play_button"
android:layout_width="150sp"
android:layout_height="75sp"
android:layout_marginTop="20sp"
android:onClick="@{() -> viewmodel.onPlayClicked()}"
android:text="@string/play_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minus_layout"
app:layout_constraintVertical_bias="0.026"
app:playState="@{uistate}"/>
</layout>
UIState
本身是不言自明的。
data class UIState(var isPlaying: Boolean)
和() -> viewmodel.onPlayClicked()
在Boolean
处翻转UIState
。
编译后,数据绑定编译器将引发以下错误:
Cannot find a setter for <android.widget.Button app:playState>
that accepts parameter type 'com.mypackage.ui.UIState'
我尝试过:
答案 0 :(得分:0)
您不必使用@JvmStatic
,因为您使用的是Kotlin扩展功能。
答案 1 :(得分:0)
您需要将视图引用作为参数添加到BindingAdapter方法中。
@BindingAdapter("playState")
fun setPlayState(button:Button,item: UIState) {
//do your work here
}
答案 2 :(得分:0)
您的名称空间
xmlns:app =“ http://schemas.android.com/apk/res-auto”
对于自定义绑定适配器是错误的。请使用名称空间
xmlns:app =“ http://schemas.android.com/tools”
由于app:playState
不在您指定的命名空间中,因此无法正常工作
答案 3 :(得分:0)
我认为您错过了在gradle中添加kotlin插件
apply plugin: 'kotlin-kapt'