今天终于把天气预报给弄出来了,心里小小的高兴一下,虽然这东西网上早就有了,但那毕竟是别人的。在想做这个之前,以为天气预报软件好高深,不知道从何下手。不过现在想想这东西也不是想象中那么复杂。最主要的是自己亲手做出来,感觉挺很爽的,要是有真机就更好了!
OK,在下面我把天气预报简单叫weather好了,在做weather之前我在网上有搜了一下有关它的资料,知道weather一般的是解析XML文档来获取信息。可能还有别的方式Json.... 然后再结合自己学的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>
这东西让我蛋疼了很久,升级后,模拟器当时连个错都不爆,千万不要忘记。
分享到:
相关推荐
主要用到了ListView AutoCompleteTextView SAX技术, 程序截图见 http://blog.csdn.net/manymore13/article/details/6957795
Android Studio实现天气预报APP系统源码(也可做Android本科毕业设计Android Studio实现天气预报APP系统源码(也可做Android本科毕业设计Android Studio实现天气预报APP系统源码(也可做Android本科毕业设计Android ...
安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业...
【Android Studio天气预报】是一个基于Android Studio开发的简单天气应用项目。这个项目的核心在于`main`文件,它包含了应用程序的主要逻辑。在Android开发中,`main`通常指的是`MainActivity`,这是应用程序启动时...
每四小时自动更新;可选城市;sax解析本地资源;apache网络下载;widget同步更新显示;
【Android天气预报应用开发】 在Android平台上开发天气预报应用是一个典型的移动应用开发案例,涉及到网络数据获取、地理位置定位、UI设计以及数据存储等多个方面。以下是对这个实验报告中涉及的知识点的详细说明:...
Android Studio 天气预报,含有基本功能:可以罗列全国所有的省、市、县;可以查看全国任意城市天气信息;可以自由切换城市,去产看其他城市的天气;提供手动更新以及后台自动更新天气功能。访问中国所有省份,需要...
在Android Studio中实现一个天气预报小程序,涉及到许多关键的Android开发技术。首先,我们需要了解Android Studio作为集成开发环境(IDE)的基本使用,包括项目创建、布局设计、代码编写以及调试等流程。 1. **...
android天气预报android天气预报android天气预报android天气预报android天气预报android天气预报
移动 android studio 天气预报。 最近买了本书《Android第一行代码》,通篇看了下感觉不错,书本最后有个实战项目酷欧天气,闲来无事就照着敲了一遍代码,主要在请求天气接口和背景优化做了些小改动,现在来记录下。...
在Android平台上开发一款简易天气预报应用,涉及到的关键技术主要包括网络请求、数据解析和用户界面展示。这个项目可以作为学习和实践OkHttp与Gson库的一个好案例。下面将详细讲解这些知识点。 首先,**OkHttp** 是...
在本项目"天气预报案例Android"中,开发者利用了百度APIStore提供的免费天气预报数据,构建了一个Android应用程序。这个应用不仅涉及到了基本的JSON数据解析,还涵盖了如何将获取的数据存储到本地数据库,以实现离线...
在Android平台上开发一款天气预报应用是一项综合性的任务,涉及到网络请求、数据解析、UI设计以及图形绘制等多个技术领域。下面将详细阐述这个过程中所涉及的关键知识点。 首先,我们需要获取天气数据。这通常通过...
android天气预报程序源码 实现了全国各城市天气信息的获取 可以展示最近六天的天气状况 对于android学习者有很大的帮助
【Android Studio项目《天气预报app》详解】 在移动开发领域,Android Studio是Google推出的一款集成开发环境(IDE),专门用于构建Android应用。本项目《天气预报app》是基于Android Studio开发的一个实例,它展示...
Android-天气预报(源码).zip
该天气预报APP是基于Android Studio开发的,旨在模仿华为原生的天气应用,适用于学习和实践安卓应用开发的大型项目。下面将详细讲解这个项目的知识点: 1. **Android Studio**:作为Google官方推荐的Android应用...
基于Android的天气预报软件旨在提供一个便捷的平台,让人们能够随时随地获取所需城市的最新天气信息。随着移动设备的普及,尤其是Android系统的广泛应用,开发这样一款应用显得尤为重要。 2 相关工作 在Android...
Android本科毕业设计基于Android的天气预报开发APP系统源码。显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道...