Подтвердить что ты не робот

Android Можно ли определить карту в XML файле?

Я пытался определить статическую хеш-таблицу, которая использует ресурсы, но я был ошеломлен невозможностью доступа к ресурсам статически. Затем я понял, что лучшие места для определения статической карты в самих файлах ресурсов.

Как определить карту в XML? Я считаю, что по возможности он должен быть похож на механизм Listpreference с записями и значениями записей.

4b9b3361

Ответ 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>.

Ответ 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]);
}

Ответ 3

Вы всегда можете вставлять json в свой файл strings.xml:

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

Этот код нуждается в google-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;
}

Ответ 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;
}