我试图定义一个静态哈希表,使资源的使用,但我得到了由静态访问资源是不可能的百般阻挠。
然后我意识到,最好所有地方的定义静态地图是在资源文件本身。
我怎样才能在XML中定义的地图? 我相信,如果可能的话,应该是类似于Listpreference机制,条目和条目值。
Answer 1:
我怎样才能在XML中定义的地图?
<thisIsMyMap>
<entry key="foo">bar</entry>
<entry key="goo">baz</entry>
<!-- as many more as your heart desires -->
</thisIsMyMap>
把这个在res/xml/
,以及使用加载它getResources().getXml()
走在事件建立一个HashMap<String, String>
。
Answer 2:
一个简单的办法是使用两个数组。 这有没有再次遍历XML文件的好处,使用更少的代码和它更直截了当地使用不同类型的数组。
<string-array name="myvariablename_keys">
<item>key1</item>
<item>key1</item>
</string-array>
<string-array name="myvariablename_values">
<item>value1</item>
<item>value2</item>
</string-array>
然后你的Java代码应该是这样的:
String[] keys = this.getResources().getStringArray(R.array.myvariablename_keys);
String[] values = this.getResources().getStringArray(R.array.myvariablename_values);
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
for (int i = 0; i < Math.min(keys.length, values.length); ++i) {
map.put(keys[i], values[i]);
}
Answer 3:
你总是可以嵌入您的strings.xml文件中的JSON:
RES /值/ strings.xml中
<string name="my_map">{"F":"FOO","B":"BAR"}</string>
和你的活动中,你可以建立你的地图onStart
方法:
private HashMap<String, String> myMap;
@Override
protected void onStart() {
super.onStart();
myMap = new Gson().fromJson(getString(R.string.my_map), new TypeToken<HashMap<String, String>>(){}.getType());
}
此代码需要谷歌,GSON API工作,你可以使用内置的JSON API在Android SDK做到这一点。
至于访问的静态地图,你可以创建一个静态方法:
private static HashMap<String, String> method(Context context) {
HashMap<String, String> myMap = new Gson().fromJson(context.getString(R.string.serve_times), new TypeToken<HashMap<String, String>>(){}.getType());
retrun myMap;
}
Answer 4:
正确的答案是由CommonsWare上面提到,但由于XML的解析不是那么简单,如下为此,一个简单的解析器:
public static Map<String, String> getHashMapResource(Context context, int hashMapResId) {
Map<String, String> map = new HashMap<>();
XmlResourceParser parser = context.getResources().getXml(hashMapResId);
String key = null, value = null;
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("entry")) {
key = parser.getAttributeValue(null, "key");
if (null == key) {
parser.close();
return null;
}
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals("entry")) {
map.put(key, value);
key = null;
value = null;
}
} else if (eventType == XmlPullParser.TEXT) {
if (null != key) {
value = parser.getText();
}
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return map;
}
文章来源: Android Is it possible to define a map in an XML file?