Android是否可以在XML文件中定义地图?

我试图定义一个利用资源的静态散列表,但是我被静态访问资源的可能性限制了。

然后我意识到,定义一个静态地图的最好的地方是在资源文件本身。

我怎样才能定义一个XML的地图? 我相信,如果可能的话,它应该类似于Listpreference机制,具有条目和条目值。

我怎样才能定义一个XML的地图?

<thisIsMyMap> <entry key="foo">bar</entry> <entry key="goo">baz</entry> <!-- as many more as your heart desires --> </thisIsMyMap> 

把它放在res/xml/ ,并使用getResources().getXml()加载它。 走事件来build立一个HashMap<String, String>

更简单的select是使用两个数组。 这有利于不再次迭代xml文件,使用更less的代码,更直接地使用不同types的数组。

 <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]); } 

你总是可以在你的strings.xml文件中embeddedjson:

RES /值/ strings.xml中

 <string name="my_map">{"F":"FOO","B":"BAR"}</string> 

在您的活动中,您可以在onStart方法中构build您的地图:

 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()); } 

这段代码需要google-gson api来工作,你可以使用android sdk中内build的json api来完成。

至于静态访问Map,你可以创build一个静态方法:

 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; } 

上面的CommonsWare提到了正确的答案,但是因为XMLparsing并不是那么简单,就像为了这个目的遵循一个简单的parsing器:

 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; }