Мне потребовалось немного, чтобы понять, но это довольно просто. Для этого примера у меня есть пользовательские основные цвета, которые пользователь выбирает на веб-сайте, который отражается в приложении. Я храню этот цвет в общих настройках, и вы увидите метод getSP PrimaryColorHex, который просто вызывает метод расширения, чтобы получить его из SharedPreferences, где он загружается при запуске приложения. Не имеет значения для образца.
Сначала необходимо создать свой синглтон и пометить функцию доступа с помощью JVMStati c, чтобы ее можно было использовать для генерации классов привязки данных.
ПРИМЕР:
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()
}
}
Наконец, если вы хотите, вы можете поместить @ JVMStati c поверх переменной-члена вместо getInstance и использовать ее напрямую, если хотите. Кроме того, помните, что имя должно отличаться от получателя.
Если вы используете
var instance -> auto generates property of getInstance setInstance
, поэтому, имея
fun getInstance() -> will create conflict
, придумайте уникальное имя, чтобы избежать конфликт или просто использовать переменную напрямую. Я сделал все CAPS, чтобы избежать конфликта в этом примере.
Happy Coding!