【问题标题】:Android and getting a view with id cast as a stringAndroid 并获取一个将 id 转换为字符串的视图
【发布时间】:2011-06-11 10:25:18
【问题描述】:

在 Android 项目的 Java 代码中,如果您想要查看资源的引用,您可以执行以下操作:

View addButton = findViewById(R.id.button_0);

在上面的 R.id.button_0 不是一个字符串。是否可以通过字符串来动态引用资源,比如“R.id.button_0”?

我想用“R.id.button_%i”引用一个按钮,其中%i 被一些有效的索引替换。

【问题讨论】:

    标签: java android layout


    【解决方案1】:
    int resID = getResources().getIdentifier("button_%i",
        "id", getPackageName());
    View addButton = findViewById(resID);
    

    其中%i 被某个有效索引替换。

    getResources() 方法属于Context 类,因此您可以直接从Activity 使用它。如果您不在活动中,请使用上下文访问:(myCtxt.getResources())。

    【讨论】:

    • @Christian:谢谢。完美。
    • 请注意,这将比直接使用 ID 慢得多。
    • 谢谢,正是我想要的。顺便说一句,我修复了此代码示例中的编译错误。
    • @hackbod 为什么会变慢?如果您或其他人可以为您的断言指向文档参考,那就太好了。
    • 它比较慢,因为它不是访问 ID(这只是一个普通的 Java 常量),而是调用一堆可能使用反射来获取常量值的方法。另见stackoverflow.com/questions/3502674/why-reflection-is-slow
    【解决方案2】:

    您可以尝试将所需的所有 id 放入一个数组中,然后使用该数组来动态引用您的资源。

    【讨论】:

    • 这可能是一些特殊场合的好方法(当资源名称更改或顺序复杂时);否则我认为这不是更好的方法。有时你会得到一个巨大的数组,这会让你的代码看起来很臭。
    • @cristian 它确实编写了可怕的讨厌的代码。我过去做过这件事的地方,我把它推到了它自己的静态类中。但是您的方法似乎更好一些;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多