如何在onCreate()之前对静态String使用getString()?

And*_*res 18 string static android android-resources

我想在getString()创建活动之前使用从资源中获取String以将其分配给String数组:

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)
};
Run Code Online (Sandbox Code Playgroud)

当我使用时Resources.getSystem().getString(R.string.LCMeterMenu),Eclipse不会抱怨但是我在运行时遇到错误:

引起:android.content.res.Resources $ NotFoundException:字符串资源ID#0x7f0a000a

但如果我把它放进去onCreate():

Log.i("StringR", "String: " + getString(R.string.LCMeterMenu));
Run Code Online (Sandbox Code Playgroud)

我得到了String,但我不能将它分配给我之前定义的最终字符串.如果我在使用getString()之前只使用onCreate()静态错误消息.如何在onCreate()全局变量之前使用资源?

Ted*_*opp 27

您无法static final从资源初始化字段; 该字段需要在初始化类时初始化,并且在应用程序资源在运行时绑定之前发生.(顺便说一句,你不能使用的原因Resources.getSystem()Resources你获得的对象只包含系统资源,而不包含任何应用程序资源.)

如果在绑定应用程序资源之前需要这些字符串,那么唯一可行的做法是将字符串直接放入代码中.但是,"Android方式"将是组织代码,因此初始化只需要在(或之后)发生onCreate().只需初始化字符串数组onCreate(),不要担心使字段为静态或最终.

如果您不希望字符串数组与特定活动相关联,那么您可以Application从应用程序类的onCreate()方法内的资源子类化并读取该数组.(您还需要在清单中声明自定义应用程序类.)但是,文档建议不要使用此类方法.(由于数组是私有的,我怀疑它与单个活动密切相关,因此使用Application子类似乎并不合理.)

另一种方法是为数组声明一个单例类.单例访问器函数需要一个,Context以便在必要时可以检索资源:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(这假设字符串数据是<string-array>在他的答案中建议的@JaiSoni这样的资源中定义的.)再一次,无法声明成员字段final.