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对象,但这里踩到了坑了,这个细节还是需要注意的。

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

被折叠的 条评论
为什么被折叠?



