Android问题—Resources对象

本文探讨了在Android开发中两种不同的资源获取方式:Resources.getSystem()与Context.getResources()的区别。通过一个具体的例子说明了如何正确地从应用中获取资源ID,并解释了这两种方式背后的原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Resources不同获取方式

最近在测试一段资源获取代码时,发现语法等均没有错误,但无法准确获取到资源ID,结果总是返回0。

代码如下:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_proguard)

    val name = "airplane_space"
    findViewById<AppCompatButton>(R.id.button_get_identifier_res).setOnClickListener {
        val resID = Resources.getSystem().getIdentifier(name, "mipmap", packageName)
        findViewById<AppCompatImageView>(R.id.image_ret).setImageResource(resID)
    }
}

在运行后的结果是,resID返回总是0。

反复测试下,一直未怀疑到 Resources对象的获取方式有问题,在反复测试后才关注到这个问题。
Resources.getSystem()替换为resources,即:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_proguard)

    val name = "airplane_space"
    findViewById<AppCompatButton>(R.id.button_get_identifier_res).setOnClickListener {
        val resID = resources.getIdentifier(name, "mipmap", packageName)
        findViewById<AppCompatImageView>(R.id.image_ret).setImageResource(resID)
    }
}

再运行后即可获取到正确的resID值。

Resources.getSystem()

这个方式获取的Resources对象,其关联到的只能是系统资源,即只能访问系统资源,不能访问app资源(application resources)。

这样的获取方式,并不能在当前运行的Activity等组件运行时使用其dimen,也不会根据方向而改变。运行时不会被运行时资源影响。

Context.getResources()

返回与Application关联的Resources对象,即通过这个对象,可以访问到app资源。这个Resources对象与通过getAssets()返回的AssetManager对象一致,即他们共享有一个Configuration数据。

一般大家在开发过程中很少会使用Resources.getSystem()方式去获取Resources对象,但这里踩到了坑了,这个细节还是需要注意的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚妄皆空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值