当前位置: 首页 > 知识库问答 >
问题:

如何在onCreate()之前对静态字符串使用getString()?

齐嘉庆
2023-03-14

我试图使用getString()从资源中获取字符串,以便在创建活动之前将其分配给字符串数组:

private static final String[] MenuNames = {
    Resources.getSystem().getString(R.string.LCMeterMenu),
    Resources.getSystem().getString(R.string.FrecMenu),
    Resources.getSystem().getString(R.string.LogicAnalyzerMenu),
    "Prueba con achartengine",
    Resources.getSystem().getString(R.string.BrazoMenu)
};

当我使用resources.getsystem().getstring(r.string.lcmetermenu)时,Eclipse不会抱怨,但在运行时会出现错误:

由:Android.content.res.resources$NotFoundException:字符串资源ID#0x7F0A000A引起

但是,如果我在oncreate():

Log.i("StringR", "String: " + getString(R.string.LCMeterMenu));

我得到了字符串,但我不能将它分配给我之前定义的最后一个字符串。如果在oncreate()之前仅使用getstring(),则会得到和静态错误消息。如何在oncreate()之前使用全局变量的资源?

共有1个答案

庞乐池
2023-03-14

不能从资源中初始化静态final字段;字段需要在初始化类时初始化,并且在运行时绑定应用程序资源之前初始化。(顺便说一句,不能使用resources.getsystem()的原因是,以这种方式获得的resources对象只包含系统资源,而不包含任何应用程序资源。)

如果您需要在绑定应用程序资源之前使用这些字符串,那么唯一可行的做法就是将这些字符串直接放入代码中。然而,“Android方式”是组织代码,这样初始化只需要在oncreate()期间(或之后)进行。只需在oncreate()中初始化string数组,而不必担心将字段设置为static或final。

如果不希望字符串数组与特定活动相关联,那么可以将application子类化,并从应用程序类的oncreate()方法中的资源读取数组。(您还需要在清单中html" target="_blank">声明您的自定义应用程序类。)然而,文件建议反对这种方法。(由于数组是私有的,我怀疑它与单个活动密切相关,因此似乎不需要使用application子类。)

public class StringArray {
    private static String[] theArray;
    public static String[] getArray(Context context) {
        if (theArray == null) {
            theArray = context.getResources().getStringArray(R.array.my_strings);
        }
        return theArray;
    }
}

(假设字符串数据是在 资源中定义的,就像@jaisoni在回答中建议的那样。)同样,成员字段不能声明为final

 类似资料:
  • 问题内容: 我将SET1声明为静态String [],我想将SET2声明为SET1 +其他一些参数。是否可以声明SET2与SET1静态相似(即私有静态String []),但使用上面的定义,如果不这样做的话? 问题答案: 查看Commons Util ArrayUtils.add:

  • 问题内容: 表: 值: 我想之前替换字符串用。 结果: 如何使用子字符串和基于字符串中的字符进行替换? 问题答案: 您甚至不需要使用或,您可以使用以下命令: 您可以使用以下方法进行测试:

  • 注意此问题包含在Rust 1.0之前的语法。代码无效,但概念仍然相关。 如何在Rust中创建字符串的全局静态数组? 对于整数,这将编译: 但我无法获得类似的字符串编译:

  • 问题内容: 我想要这个HTML … …像这样渲染 Q1。苹果 Q2。橘子 换句话说,我希望自动生成的数字以静态字符串“ Q”为前缀。 我试过这样的CSS: 但这产生了: 苹果 橙子 我也尝试过使用“ list-style:numberedinside;”,但这只是将列表右移,结果相同。我找不到以任何方式引用自动生成的数字元素来向其添加CSS样式信息的方法。这似乎是一个简单,常见的场景,但是我找不到

  • 我在一段对性能要求非常高的代码中工作。我需要执行一些格式化的字符串操作,但我正在努力避免内存分配,甚至是内部库分配。 在过去,我会做类似于以下的事情(假设C11): 我更喜欢使用所有C方法(例如ostringstream)来执行此操作,而不是旧的C函数。 我意识到我可以使用std::string::reserve和std::ostringstream提前获取空间,但这仍然会执行至少一次分配。 有人

  • 问题内容: 我在Java中使用String.format()尝试模拟C语言中可用的printf()控制通道。我了解如何指定将字符串放置在20个字符,5个,2个…的字段中, 3位小数,2位等。但是,字符串在其字段中右对齐打印。 如何将弦左对齐? 这里是一个可能的输出,我想修改左对齐的例子,并在各自的领域。 *注意:请将“-”视为空白 问题答案: 与printf相同-使用格式的修饰符