如何在自定义的简单类中访问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
相关产品推荐
相关产品推荐

