天气预报之三(Android版)
来源:互联网 发布:华为5a手机壳 淘宝 编辑:程序博客网 时间:2024/06/09 17:57
本文来自 http://blog.csdn.net/manymore13
今天终于把天气预报给弄出来了,心里小小的高兴一下,虽然这东西网上早就有了,但那毕竟是别人的。在想做这个之前,以为
天气预报软件好高深,不知道从何下手。不过现在想想这东西也不是想象中那么复杂。最主要的是自己亲手做出来,感觉挺很爽
的,要是有真机就更好了!
OK,在下面我把天气预报简单叫weather好了,在做weather之前我在网上有搜了一下有关它的资料,知道weather一般的是
解析XML文档来获取信息。
可能还有别的方式Json....所以就有了之前两篇学习解析XML的学习天气预报Dom解析 和 学习SAX解析 以这两篇学习做铺垫。然
后再结合自己学的Android知识就可以完成本次小程序。本次写的weather里主要涉及到AutoCompleteTextView,ListView以及
SAX技术 。先上weather运行时的效果图:
weather布局很丑,哎,俺没啥艺术细胞,只想到这样的布局,重在功能实现上。这次是用SAX解析XML,同样是用到了谷歌提供
的天气接口。在上次的学习SAX解析 中里面我做的是解析本地的XML,很顺利。在做weather的同时我顺便写了个控制台版的天气
预报,发现了有同样的问题:结果只出现温度,而中文信息却是乱码。在这上面我纠结了大半天后来才知道为什么,原因是编码不
对,最后换成了GBK编码就搞定了 下面是代码片段。
URL url = new URL(path);URLConnection conn = url.openConnection();InputStreamReader isr = new InputStreamReader(conn.getInputStream(),"GBK"); //GBK编码就OK,用utf-8还是出现乱码BufferedReader br = new BufferedReader(isr);InputSource is = new InputSource(br);xmlReader.parse(is);
另外,ListView用SimpleAdapter加载图片,这个适配器的数据是键值对(Map)形式的,如果map中包含有图片,而这个图片不是在
drawable中存在的,比如网络图片,simpleAdapter本身就不支持的。除非你重写适配器(Adapter),
或者用ViewBinder 具体用法见API文档
public void setViewBinder (SimpleAdapter.ViewBinder viewBinder)
SimpleAdapter的外部数据(external clients)可以使用这个类将值绑定到视图。你应该用这个类绑定值到那些不能直接通过SimpleAdapter支持的视图,或者改变通过SimpleAdapter支持绑定的方法的视图。
也就是说simpleAdapter不能直接支持ImageView,像TextView就直接支持,不用大费周章绑定数据。
下面是主类继承Activity
package com.weather.manymore13;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.Map;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Color;import android.os.Bundle;import android.text.StaticLayout;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleAdapter.ViewBinder;import android.widget.TextView;public class WeatherActivity extends Activity {private AutoCompleteTextView autoText;private Button btnConfirm;private TextView tViewCurrent;private ListView lv;private ArrayList<Map<String,Object>> list;private ImageView currentIcon;private TextView currentInfo;private TextView futionTime;private SimpleAdapter simpAdapter = null;private boolean visit = true; public void init() { autoText = (AutoCompleteTextView)findViewById(R.id.autoTextView); btnConfirm = (Button)findViewById(R.id.btn_confirm); tViewCurrent = (TextView)findViewById(R.id.current_time); lv = (ListView)findViewById(R.id.myListView); currentIcon = (ImageView)findViewById(R.id.current_icon); currentInfo = (TextView)findViewById(R.id.current_info); futionTime = (TextView)findViewById(R.id.future_time); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_dropdown_item_1line, Tools.city); autoText.setAdapter(arrayAdapter); btnConfirm.setOnClickListener(new OnClickListener() {public void onClick(View arg0) {System.out.println("按钮被按下");String city = autoText.getText().toString().trim();tViewCurrent.setVisibility(View.INVISIBLE);futionTime.setVisibility(View.INVISIBLE);if(!(city.equals(""))){try {obtainWeacherInfo(Tools.SEACH_URL+city);if(simpAdapter!=null){simpAdapter.notifyDataSetChanged();}} catch (MalformedURLException e) {System.out.println("url出错");e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}}); } public void obtainWeacherInfo(String path) throws ParserConfigurationException, SAXException, UnsupportedEncodingException, IOException { SAXParserFactory parserFactory = SAXParserFactory.newInstance(); SAXParser sp = parserFactory.newSAXParser();XMLReader xmlReader = sp.getXMLReader();WeacherHandler handler = new WeacherHandler();xmlReader.setContentHandler(handler);URL url = new URL(path);URLConnection conn = url.openConnection();InputStreamReader isr = new InputStreamReader(conn.getInputStream(),"GBK");BufferedReader br = new BufferedReader(isr);InputSource is = new InputSource(br);xmlReader.parse(is);br.close();displayWeatherInfo(handler); } public void displayWeatherInfo(WeacherHandler handler) { list = handler.getForecastWeachers(); //显示实时信息 Bitmap bmp = handler.getCurrentWeather().getBmp(); String currentInfoStr = handler.getCurrentWeather().getCurrentInfo().toString(); currentIcon.setImageBitmap(bmp); currentInfo.setText(currentInfoStr); if(list.size() < 1) { System.out.println("displayWeatherInfo: list.size() < 1"); currentInfo.setText(R.string.prompt); currentInfo.setTextColor(Color.YELLOW); currentInfo.setVisibility(View.VISIBLE); } // 显示未来天气, 我们这里是在ListView中显示 String[] itemName = new String[]{"week","temperature","condition","icon"}; int[] itemId = new int[]{R.id.week, R.id.temperature, R.id.condition,R.id.icon}; simpAdapter = new SimpleAdapter(this, list,R.layout.list_item, itemName,itemId); lv.setAdapter(simpAdapter); if(list.size() > 0) { tViewCurrent.setVisibility(View.VISIBLE); futionTime.setVisibility(View.VISIBLE); } // 注意在这里用到了绑定数据 ImageView绑定了网络图片 simpAdapter.setViewBinder(new ViewBinder() {public boolean setViewValue(View view, Object data,String textRepresentation) {if(view instanceof ImageView && data instanceof Bitmap){ ImageView iv = (ImageView) view; iv.setImageBitmap((Bitmap) data); return true; }else { return false; } } }); }}
在这个里面跟网络地址建立连接,需要得到InputStream流,在这种情况下一般得另开一个线程,这都是耗时的操作,不然有的时
候网路出现延迟就会导致程序假死在哪里就不好使了,在这个weather里我没有用线程,随着一步一步的学习后面再加上,
最后 ,别忘了加这玩意儿 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
这东西让我蛋疼了很久,升级后,模拟器当时连个错都不爆,千万不要忘记。
manymore13的weather源码 上传日期:2011-11-11 百年一遇的神棍节,俺们太激动了!做了这么多年光棍在今年依然是光棍,依然坚强着活着!我在这里祝各位棍
友神棍节快乐!棍子棒棒的!
本次记录就到此为止。
- 天气预报之三(Android版)
- <Android 应用 之路> 天气预报(三)
- Android天气预报程序(三)
- Android酱油笔记之天气预报
- Android笔记之天气预报接口
- Android实验九之天气预报
- 天气预报(Android版)
- Android应用实例之----天气预报程序.
- Android应用实例之----天气预报程序
- Android应用实例之----天气预报程序
- Android项目 之 天气预报(附源码)
- Android进阶2之谷歌天气预报
- Android应用实例之----天气预报程序.
- <Android 应用 之路> 天气预报(一)
- <Android 应用 之路> 天气预报(二)
- <Android 应用 之路> 天气预报(四)
- <Android 应用 之路> 天气预报(五)
- Android解析聚合数据之天气预报
- hello world
- Java 装饰者设计模式
- VC小技巧 15个问题
- 使用Open Flash Chart(OFC)制作图表(Struts2处理)
- Lu数值计算扩展动态库LuMath V1.0
- 天气预报之三(Android版)
- Table
- sql-front的key
- 动态生成表
- 7k7k实习学习到的
- 装箱问题 01背包
- poj3080
- 如何在虚拟机中安装MacOS
- joj 1189