首页 > 代码库 > 天气预报app---教程二

天气预报app---教程二

第二部分就是选择城市,然后获得数据这一块了。

首先全国城市很多,我们肯定不能在程序里写个数组之类的存着,所以我们应该下载个全国城市xml的数据,然后放在Android assents目录下,然后解析xml得到省份和城市。这里我选择了SAX解析。

 SAXParser saxParser=SAXParserFactory.newInstance().newSAXParser();
            saxParser.parse(getResources().getAssets().open("citys.xml"),myHandler);

通过assents目录打开一个流,然后用sax解析的核心函数。

通过sax解析,我们就能得到省份和城市 这里我用hashmap存储了map{{省份},{ArrayList<city>}}。这样省份下的城市我们就可以直接取出,方便后面一个选择省份后出现对应的城市,形成一个listvie的联动

public class MyHandler extends DefaultHandler{
    public ArrayList provice=new ArrayList();
    public ArrayList item=new ArrayList();
    public HashMap<String,ArrayList> items=new HashMap();
    String beginstring="";
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if ("province".equals(localName)){
            provice.add(attributes.getValue(0));
            beginstring=attributes.getValue(0);
        }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String temp=new String(ch,start,length);
        if (!temp.trim().equals("")&&!temp.trim().equals("\n")){
            item.add(temp);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if ("province".equals(localName)) {
            items.put(beginstring, item);
            item = new ArrayList();
        }
    }
}

上面是sax解析的方法实现。现在我们还缺一些东西,第一个就是点击按钮以后调到下一个界面去选择城市,然后返回城市,显示天气。第二个就是保存城市,下次默认加载。

第一个问题比较简单startActivityForResult,这个方法就可以解决问题,第二个就是保存文件时,要注意有的手机可能没有外置存储卡,所以我们最好是把文件放在应用程序对应的目录下,android下自带的openFileOutput()和openFileInput()方法就可以解决这个问题

天气预报app---教程二