Как использовать метод класса Singleton внутри xml привязки данных? - PullRequest
3 голосов
/ 10 февраля 2020

У меня есть одноэлементный класс в моем проекте android studio kotlin, и я хочу использовать его метод внутри xml. Например, у меня есть переменная внутри xml с тегом @{appointment.startTime}. Я хочу отформатировать это время встречи с использованием глобальной функции, и эта функция существует в моем одноэлементном классе с именем parse(startTime: String), но я не могу получить к нему доступ. Я попытался сделать:

@{SingeltonClass.parse(appointment.startTime)}

Но это не работает вообще. Я попытался создать переменную с типом класса и попытался получить к ней доступ, но он не работает и с этим. Ваша помощь сделает мой день! Заранее спасибо.

1 Ответ

1 голос
/ 25 марта 2020

Мне потребовалось немного, чтобы понять, но это довольно просто. Для этого примера у меня есть пользовательские основные цвета, которые пользователь выбирает на веб-сайте, который отражается в приложении. Я храню этот цвет в общих настройках, и вы увидите метод 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!

...