【问题标题】:How to use Singleton class method inside xml data binding?如何在 xml 数据绑定中使用 Singleton 类方法?
【发布时间】:2020-05-25 20:45:06
【问题描述】:

我的 android studio kotlin 项目中有一个单例类,我想在 xml 中使用它的方法。例如,我在 xml 中有一个变量 带有标签@{appointment.startTime}。 我想使用全局函数格式化这个约会开始时间,并且该函数存在于我的单例类中,名称为 parse(startTime: String),但我无法访问它。我试着做:

@{SingeltonClass.parse(appointment.startTime)}

但它根本不起作用。我尝试使用类类型创建一个变量并尝试访问它,但它也不适用于该变量。你的帮助会让我开心!提前致谢。

【问题讨论】:

  • 能否请您发布更多相关代码?

标签: android android-studio mvvm data-binding singleton


【解决方案1】:

我花了一点时间才弄明白,但它相当直截了当。对于此示例,我有用户在应用程序中反映的网站上选择的自定义原色。我将此颜色存储在 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

所以想出一个唯一的名字来避免冲突或者直接使用变量。我做了所有的大写以避免这个例子中的冲突。

编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多