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

ilo*_*mbo 22 xml resources android map

我试图定义一个利用资源的静态哈希表,但是由于无法静态访问资源而陷入困境.

然后我意识到,定义静态地图的最佳位置是资源文件本身.

如何在XML中定义地图?我相信如果可能的话,它应该类似于Listpreference机制,包含条目和条目值.

van*_*rra 34

一个更简单的选择是使用两个数组.这样做的好处是不会再次迭代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>
Run Code Online (Sandbox Code Playgroud)

然后你的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]);
}
Run Code Online (Sandbox Code Playgroud)


Com*_*are 27

如何在XML中定义地图?

<thisIsMyMap>
  <entry key="foo">bar</entry>
  <entry key="goo">baz</entry>
  <!-- as many more as your heart desires -->
</thisIsMyMap>
Run Code Online (Sandbox Code Playgroud)

把它放入res/xml/,并使用它加载getResources().getXml().参加活动以建立一个HashMap<String, String>.

  • 这个例子不完整.编写XML很容易,编写解析器很慢而且很痛苦.请参阅下面的示例,了解更简单的解决方案. (3认同)
  • @ilomambo:在自定义`Application`子类的`onCreate()`中初​​始化哈希映射.在您创建任何"ContentProviders"之后,但在您的应用程序的任何其他内容运行之前调用.`Application`是一个`Context`,应该可以解析这个XML. (2认同)

Aye*_*ieh 9

您始终可以在strings.xml文件中嵌入json:

RES /值/ strings.xml中

<string name="my_map">{"F":"FOO","B":"BAR"}</string>
Run Code Online (Sandbox Code Playgroud)

在您的活动中,您可以在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());
}
Run Code Online (Sandbox Code Playgroud)

这段代码需要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());
    retrun myMap;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ian 6

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