【问题标题】:What does getResources().getIdentifier() do in android?getResources().getIdentifier() 在 android 中有什么作用?
【发布时间】:2020-10-05 15:17:27
【问题描述】:

我正在尝试创建一个应用来播放与按钮名称相同的歌曲。

然后我遇到了这个answer,它使用了问题中的命令。

我想知道该命令的实际作用。

请用简单的话解释一下。

【问题讨论】:

    标签: android


    【解决方案1】:

    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 规则来保留某些特定资源以避免它们被删除。

    【讨论】:

    • 返回给定资源名称的资源标识符是什么意思。?你能用简单的话说出来吗?我看不懂文档。
    • 查看更新的答案以获得更广泛的解释
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多