我试图定义一个利用资源的静态哈希表,但由于无法静态访问资源而被阻挡。
然后我意识到,在资源文件中定义静态映射是最好的选择。
如何在XML中定义一个映射? 我认为如果可能的话,应该类似于Listpreference机制,具有条目和条目值。
我试图定义一个利用资源的静态哈希表,但由于无法静态访问资源而被阻挡。
然后我意识到,在资源文件中定义静态映射是最好的选择。
如何在XML中定义一个映射? 我认为如果可能的话,应该类似于Listpreference机制,具有条目和条目值。
更简单的选择是使用两个数组。这样做的好处是不必再次迭代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]);
}
keys.zip(values).toMap()
。 - YaMiN我该如何在XML中定义一个Map?
<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>
。Application
子类的onCreate()
中初始化您的哈希映射。这将在创建任何ContentProviders
之后调用,但在您的应用程序的任何其他内容运行之前进行调用。Application
是一个Context
,应该适用于解析此XML文件。 - CommonsWare<entry key="foo"><item>bar</item><item>baz</item><item>goo</item></entry>
。或者<entry key="foo"><item value="bar"/><item value="baz"/><item value="goo"/></entry>
。或者<entry key="foo"><array><item>bar</item><item>baz</item><item>goo</item></array></entry>
。或其他任何形式。XML绝对可以处理您在Java中选择建模为数组的元素集合。 - CommonsWarestrings.xml
文件中:res/values/strings.xml
<string name="my_map">{"F":"FOO","B":"BAR"}</string>
在您的Activity中,您可以在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());
}
这段代码需要使用Google Gson API才能正常运行。您可以使用Android SDK中内置的Json API来实现。
对于静态访问Map,您可以创建一个静态方法:
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());
return myMap;
}
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通常使用DefaultsXmlParser.getDefaultsFromXml()
来解析下一个语法:
<?xml version="1.0" encoding="utf-8"?>
<defaults>
<entry>
<key>api_url</key>
<value>https://</value>
</entry>
<entry>
<key>some_feature_flag</key>
<value>true</value>
</entry>
</defaults>
读取地图:
val map = DefaultsXmlParser.getDefaultsFromXml(this, R.xml.my_map)