我花了一点时间才弄明白,但它相当直截了当。对于此示例,我有用户在应用程序中反映的网站上选择的自定义原色。我将此颜色存储在 shared Preferences 中,您将看到一个名为 getSP PrimaryColorHex 的方法,它只是调用扩展方法从 SharedPreferences 中获取它,它在应用程序启动时加载。对样本不重要。
首先,您需要创建单例并使用 JVMStatic 标记访问函数,以便可以使用它来生成数据绑定类。
示例:
class YACustomPreference private constructor(): BaseObservable(){
/////////////////////////////////////////////////////////////////
// STATIC ACCESSORS
/////////////////////////////////////////////////////////////////
companion object {
/////////////////////////////////////////////////////////////////
// SINGLETON MEMBERS
/////////////////////////////////////////////////////////////////
lateinit var INSTANCE: YACustomPreference
/////////////////////////////////////////////////////////////////
// SINGLETON
/////////////////////////////////////////////////////////////////
@JvmStatic
fun getInstance(): YACustomPreference {
if(!::INSTANCE.isInitialized) {
INSTANCE = YACustomPreference()
}
return INSTANCE
}
}
/////////////////////////////////////////////////////////////////
// METHODS
/////////////////////////////////////////////////////////////////
@Bindable
fun getPrimaryColorHex(): String {
return getSPPrimaryColorHex()
}
}
然后将其导入 XML 并使用它。
示例:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.appstudio35.yourappstudio.models.YACustomPreference" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@{YACustomPreference.getInstance().primaryColorHex}" />
</layout>
另外,如果你不喜欢每次都检查初始化,你可以像这样延迟加载它:
class YACustomPreference private constructor(): BaseObservable(){
/////////////////////////////////////////////////////////////////
// STATIC ACCESSORS
/////////////////////////////////////////////////////////////////
companion object {
/////////////////////////////////////////////////////////////////
// SINGLETON MEMBERS
/////////////////////////////////////////////////////////////////
val INSTANCE: YACustomPreference by lazy {
YACustomPreference()
}
/////////////////////////////////////////////////////////////////
// SINGLETON
/////////////////////////////////////////////////////////////////
@JvmStatic
fun getInstance(): YACustomPreference {
return INSTANCE
}
}
/////////////////////////////////////////////////////////////////
// METHODS
/////////////////////////////////////////////////////////////////
@Bindable
fun getPrimaryColorHex(): String {
return getSPPrimaryColorHex()
}
}
最后,如果您愿意,可以将 @JVMStatic 放在成员变量上而不是 getInstance 上,如果愿意,可以直接使用它。另外,请记住名称必须与 getter 不同。
如果你使用
var instance -> auto generates property of getInstance setInstance
所以有
fun getInstance() -> will create conflict
所以想出一个唯一的名字来避免冲突或者直接使用变量。我做了所有的大写以避免这个例子中的冲突。
编码愉快!