【发布时间】:2020-10-05 15:17:27
【问题描述】:
【问题讨论】:
标签: android
【问题讨论】:
标签: android
getResources().getIdentifier 的作用是返回给定其实际资源名称的特定资源数字标识符。查看documentation 了解更多详情。
文档引用:
返回给定资源名称的资源标识符。
注意:不鼓励使用此功能。它效率更高 按标识符而不是按名称检索资源。
更清晰的解释:
假设我们必须在代码中使用资源,例如:
view.setBackground(R.drawable.my_red_box)
在这个例子中 my_red_box 是资源的名称,但这个名称实际上是一个整数常量,位于 resources 'R' 文件中,由 gradle 自动生成.如此有效,my_red_box 是一个 整数 常量,Android 使用它来识别特定的资源文件。
您可以通过按键盘上的 Ctrl 键并将鼠标悬停在代码中的资源名称上来检查资源整数值。 如果您对资源常量比较好奇,可以在 app/build/intermediates/runtime_symbol_list//R.txt
中找到它们因此,澄清一下,每当您键入任何资源标识符(R.drawable、R.raw 等)时,您实际上是在键入一个整数常量,并且系统使用该常量来引用资源文件。
getResources().getIdentifier 的作用是允许使用资源名称解析资源整数常量。
例如如果我们想在一个View中设置背景,我们可以照常做:
// Set the resource by using the its identifier (resource integer constant)
view.setBackground(R.drawable.my_red_box)
但使用 getResources().getIdentifier 将如下:
int resourceID = getResources().getIdentifier("my_red_box", "drawable", getPackageName());
view.setBackground(resourceID);
在最后一个示例中,resourceID 中返回的值与 R.drawable.my_red_box 完全相同。
getResources().getIdentifier 的目的是动态获取资源。有很多用例,例如,如果您有多个以数字索引结尾的同名资源,那么您可以创建一个 for 循环 并动态自动生成名称,例如 "my_red_box_1"、"my_red_box_2 "等。
for (int index = 0; index < 3; index++) {
int resourceID = getResources().getIdentifier("my_red_box_" + index, "drawable", getPackageName());
....
}
不推荐使用 getResources().getIdentifier,因为 Android 在编译时无法知道资源是否正在被使用,因此可能会在 混淆/最小化 发布版本中的代码。在这种情况下,您需要添加一个 proguard 规则来保留某些特定资源以避免它们被删除。
【讨论】: