首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Kotlin + Hilt:向对象类注入活动上下文

Kotlin + Hilt:向对象类注入活动上下文
EN

Stack Overflow用户
提问于 2022-08-21 11:01:36
回答 1查看 225关注 0票数 1

我有一个对象,它有许多与屏幕相关的方法(这里我只举两个例子)如下:

代码语言:javascript
代码运行次数:0
运行
复制
object AWScreen {

    private lateinit var context: Context

    fun init(context: Context) {
        this.context = context
    }

    private fun getScreenHeightAlternative(oContext: Context): Int {
        val display = oContext.resources.displayMetrics
        return display.heightPixels
    }

    fun getScreenWidth(context: Context?): Int {
        val size = Point()
        var screenWidth = 0
        try {
            (context as Activity).windowManager.defaultDisplay.getRealSize(size)
            screenWidth = size.x
        } catch (e: NoSuchMethodError) {
            e.printStackTrace()
        }
        return screenWidth
    }
}

我正在尝试初始化应用程序类-when应用程序中的所有依赖项(本例中仅为上下文)-如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
@HiltAndroidApp
class AWApplication : MultiDexApplication() {

    override fun onCreate() {
        super.onCreate()

        AWScreen.init(this)
    }
}

但是,如您所见,我得到的是应用程序上下文,而不是活动上下文(访问资源所需的内容)。

我可以这么做:

代码语言:javascript
代码运行次数:0
运行
复制
AWScreen.init(this)

在任何依赖于AWScreen onCreate的活动中,我都试图避免这一点,因为AWScreen在我的应用程序中被广泛使用,我不想重复代码,事实上,这就是Hilt (依赖注入)的目的。

在简历中,我有许多自定义类(对象),在这些类中,我需要一个活动上下文(而不是应用程序上下文)来访问资源(或任何其他类(取决于上下文)),但我不知道如何使用Hilt以“依赖注入方式”提供它,并避免在每个活动中初始化该对象的依赖项。

编辑1:

正如@مصطفىنعمه所提到的,我可以使用任何上下文(活动上下文和应用程序上下文)访问资源,但是在我的مصطفىنعمه类中有如下方法:

代码语言:javascript
代码运行次数:0
运行
复制
private fun getSoftButtonsBarHeight(oActivity: Activity): Int {
        val metrics = DisplayMetrics()
        oActivity.windowManager.defaultDisplay.getMetrics(metrics)
        val usableHeight = metrics.heightPixels
        oActivity.windowManager.defaultDisplay.getRealMetrics(metrics)
        val realHeight = metrics.heightPixels
        return if (realHeight > usableHeight) realHeight - usableHeight else 0
    }

在这里,我需要访问windowManager,而windowManager只在活动上下文中可用,因此,要明确的是,我需要知道的是如何将活动上下文注入自定义类。

EN

回答 1

Stack Overflow用户

发布于 2022-08-21 11:20:09

我不完全理解你的问题,但是

您可以通过应用程序上下文访问资源,通常如下所示:注入上下文后->->

代码语言:javascript
代码运行次数:0
运行
复制
val someString = context?.resources.getString(R.string.some_string) //context is nullable so "?" is needed
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73433783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档