在Android数据绑定布局中引用Observable类的属性

时间:2018-01-01 12:10:51

标签: android kotlin android-databinding

Android数据绑定框架中getter被注释为@Bindable的{​​{1}}类属性的类型是什么?

例如,让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>

问题是,在type&#34;翻译&#34;的variable属性中放入什么。

我试过了:

type="kotlin.jvm.functions.Function1&lt;String, String&gt;"

它会编译,但翻译属性更改时TextView不会更新。

我可以通过在布局XML中引入localization变量然后在绑定表达式中调用localization.translation.invoke()来实现所需的行为。我对此并不满意,想知道我是否可以直接引用translation

1 个答案:

答案 0 :(得分:1)

Localization延伸BaseObservableFunction1根本无法观察到。因此,使用Localization为您提供了一个用于观察属性更改的界面。

如果绑定translation,则它是一个设置的简单字段。如果您想要更新它,则必须再次致电setTranslation()