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.