Android数据绑定框架中,getter被注释为@Bindable
的Observable
类属性的类型是什么?
例如,让 Observable
类定义如下:
class Localization() : BaseObservable() {
var translation: (key: String) -> String by Delegates.observable(defaultTranslation) { _, _, _ ->
notifyPropertyChanged(BR.translation)
}
@Bindable get
}
然后,布局 XML 将如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="translation"
type="WHAT IS THE TYPE OF TRANSLATION?" />
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{translation.invoke(stringKey)}" />
</FrameLayout>
</layout>
问题是,在variable
"翻译"的type
属性中放什么。
我试过:
type="kotlin.jvm.functions.Function1<String, String>"
它会编译,但当翻译属性更改时,TextView
不会更新。
我可以通过在布局 XML 中引入localization
变量,然后在绑定表达式中调用localization.translation.invoke()
来实现所需的行为。我只是对此感到不舒服,想知道我是否可以直接引用translation
。
Localization
扩展BaseObservable
,而Function1
则根本无法观察到。因此,使用 Localization
为您提供了一个用于观察属性更改的界面。
如果绑定translation
,则设置的字段很简单。如果要更新它,则必须再次拨打setTranslation()
。