使用Java,我如何在Android架构中引用非标准类型的xml对象?

时间:2017-06-28 03:13:06

标签: java android xml hashmap

我刚刚开始学习创建Android应用,而且我正在努力解决看似非常基本的问题。

我正在尝试创建一个从XML加载的HashMap。但是,我无法弄清楚以这种方式存储的Map的资源ID是什么。我已经使用了解决这个问题的方法:Creating hashmap/map from XML resources

我面临的问题是如何构建res文件夹以及如何在该res文件夹中引用我的数据。

这是我目前所拥有的:

资源解析器1

public class ResourceUtils {
    public static Map<String,String> getHashMapResource(Context c, int hashMapResId) {
        Map<String,String> map = null;
        XmlResourceParser parser = c.getResources().getXml(hashMapResId);

        String key = null, value = null;

        ...

        }

        return map;
    }
}

My res/xml/map.xml file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<map name = "testMap" linked="true">
    <entry key="key1">value1</entry>
    <entry key="key2">value2</entry>
    <entry key="key3">value3</entry>
</map>

因此,为了掌握Map,我需要在调用getHashMapResource时正确输入资源ID,但我无法找到如何做到这一点!我试过了:

  • R.string.map
  • R.map.testMap
  • R.xml.map
  • R.xml.testMap

我没有想法。我确定这个问题对于知道这一点的人来说是微不足道的,但我无法在这个地方找到任何有用的东西。谢谢:))

1 个答案:

答案 0 :(得分:0)

package com.plumtestongo.sample;

import android.content.Context;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import org.xmlpull.v1.XmlPullParser;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



     Map<String,String>  map = getHashMapResource(this,R.xml.map);
        Log.i("Hello",map.toString());
    }




    public  Map<String,String> getHashMapResource(Context c, int hashMapResId) {
        Map<String,String> map = null;
        XmlResourceParser parser = c.getResources().getXml(hashMapResId);

        String key = null, value = null;



        try {
            int eventType = parser.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    Log.d("utils","Start document");
                } else if (eventType == XmlPullParser.START_TAG) {
                    if (parser.getName().equals("map")) {
                        boolean isLinked = parser.getAttributeBooleanValue(null, "linked", false);

                        map = isLinked ? new LinkedHashMap<String, String>() : new HashMap<String, String>();
                    } else 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;
}

}

我测试了它的代码。您只需要使用R.xml.map。