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