You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义的简单类中访问Android字符串资源?

更简洁地在自定义类中访问Android字符串资源

针对你不想每次传递Context的需求,这里有几种实用且简洁的解决方案:

方案1:使用全局Application Context单例

这是轻量场景下最常用的方案,利用Application的全局生命周期Context,不会造成内存泄漏。

首先自定义Application类(记得在AndroidManifest.xml中注册):

class MyApp : Application() {
    companion object {
        lateinit var INSTANCE: MyApp
            private set
    }

    override fun onCreate() {
        super.onCreate()
        INSTANCE = this
    }
}

在AndroidManifest.xml的application标签中指定该类:

<application
    android:name=".MyApp"
    <!-- 其他配置属性 -->
>

之后你的自定义类就可以直接通过全局Context获取字符串:

import com.example.myAppName.R
import com.example.myAppName.MyApp

class MyData {
    val myString = MyApp.INSTANCE.getString(R.string.name)
}

使用时无需传Context,直接初始化:

val myData = MyData()

注意:Application Context不适合需要Activity级上下文的场景(比如弹出Dialog、启动带动画的Activity),但获取字符串资源完全安全。

方案2:顶层属性/扩展函数(极简场景)

如果你的需求只是简单获取某个固定字符串,甚至可以省去自定义类,直接写顶层属性:

// 放在任意一个顶层Kotlin文件中(比如StringsHelper.kt)
import com.example.myAppName.R
import com.example.myAppName.MyApp

val myAppNameString get() = MyApp.INSTANCE.getString(R.string.name)

之后在任何地方直接调用myAppNameString即可,连类实例化步骤都省了。

方案3:依赖注入(适合大型项目)

如果你的项目已经在用Hilt/Dagger这类依赖注入框架,可以直接注入字符串资源,彻底摆脱手动传Context的麻烦。

以Hilt为例,先在AppModule中提供字符串实例:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun provideMyString(@ApplicationContext context: Context): String {
        return context.getString(R.string.name)
    }
}

然后在自定义类中通过构造函数注入:

class MyData @Inject constructor(val myString: String) {
    // 直接使用注入好的myString
}

使用时只需通过Hilt获取MyData实例,无需手动处理Context传递。

内容的提问来源于stack exchange,提问作者Elaws

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:53:22