Kotlin轻松访问活动之外的资源

时间:2019-01-21 10:47:03

标签: android kotlin

我是Android和Kotlin的新手。我正在尝试创建一个ResourcesHelper class,以便从应用程序中的任何其他自定义类轻松访问我的自定义颜色和字体。但是在这个帮助器中,我没有任何上下文。我已经阅读了获取扩展Application类的上下文的方法,但是编译器说我无法在我的ResourcesHelper伴随对象中访问此上下文,因为这会导致内存泄漏。同样,我最后得到了可选链。

这就是我想要使用它的方式:

class ResourcesHelper {

    companion object {
        val lightBlue = resources.getColor(R.color.lightBlue)
        val customBlue = resources.getColor(R.color.customBlue)
        // [...]    
        val fontAwesome = resources.getFont(R.font.fontawesome)
        val lemonMilk = resources.getFont(R.font.lemonmilk)
    }
}

enum class ButtonStyle {
    MENU,
    // [...]
    VICTORY
}

class CustomButton(c: Context, attrs: AttributeSet) : Button(c, attrs) {

    var isButtonActivated = false

    fun setStyle(style: ButtonStyle) {
        setBackgroundColor(ResourcesHelper.transparent)

        when(style) {
            ButtonStyle.MENU -> {
                setText(R.string.menu_button)
                typeface = ResourcesHelper.lemonMilk
                setBackgroundColor(ResourcesHelper.customRed)
                setTextColor(ResourcesHelper.white)
            }
            // [...]
            ButtonStyle.VICTORY -> {
                setText(R.string.victory_button)
                typeface = ResourcesHelper.lemonMilk
                setBackgroundColor(ResourcesHelper.customRed)
                setTextColor(ResourcesHelper.white)
            }
        }
    }
}

我也阅读了这篇帖子Android access to resources outside of activity,但是它是用Java语言编写的,我不知道如何在Kotlin中使用它。

我完全不知道该怎么做以及如何做……或者是否有更好的方法可以从任何地方获取资源。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

对于颜色,字符串等系统资源,您可以按以下方式使用

import android.content.res.Resources

    class ResourcesHelper {

        companion object {
            val lightBlue = Resources.getSystem().getColor(R.color.lightBlue)

        }

    }

答案 1 :(得分:0)

如果您想支持其他Android版本,建议您使用ContextCompat。它提供了统一的界面来访问不同的资源,并为较旧的Android版本提供向后兼容性。

对于 AnroidX ,使用androidx.core.content.ContextCompat,对于 SupportV4 android.support.v4.content.ContextCompat

val lightBlue = ContextCompat.getColor(context, R.color.lightBlue)
val customBlue = ContextCompat.getColor(context, R.color.customBlue)