一、 代码展示

1. 文件布局: activity_realize_forecast.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >    <LinearLayout        android:orientation="horizontal"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        >        <EditText            android:inputType="number"            android:id="@+id/input"            android:layout_width="0dip"            android:layout_height="wrap_content"             android:layout_weight="1"/>        <Button            android:id="@+id/btn"            android:layout_width="wrap_content"            android:layout_height="wrap_content"             android:text="@string/button_input"/>       </LinearLayout>        <!-- 图像显示 -->    <ImageView        android:contentDescription="@string/image_description"        android:id="@+id/iconOfWeather"        android:layout_width="wrap_content"        android:layout_height="wrap_content">    </ImageView>    <LinearLayout        android:orientation="vertical"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        >        <!-- 当前时间-->        <TextView            android:id="@+id/time"            android:layout_width="wrap_content"            android:layout_height="wrap_content"             />                <!-- 天气状况 -->        <TextView            android:id="@+id/weather"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            />        <!-- 温度  --><TextView            android:id="@+id/temp"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            />    </LinearLayout></LinearLayout>



2. 天气预报主函数:RealizeForecast.java

package com.realize.andorid.realizeforecast;import java.io.BufferedInputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class RealizeForecast extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_realize_forecast);        Button submit = (Button) findViewById(R.id.btn);        submit.setOnClickListener(new OnClickListener() {        @Override            public void onClick(View arg0) {                try {                  /* 获取用户输入的城市代号                    * 从网址上可以获取对应城市代号:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/                   */                   String city = ((EditText) findViewById(R.id.input))                       .getText().toString();                                    /* 如果用户没有输入,则弹出提示 */                     if (city.equals(""))                   {                Log.d("onClick", "city is null");                        Toast.makeText(RealizeForecast.this,                         "请输入具体的城市代号!",                         Toast.LENGTH_LONG).show();                        return;                    }                                       /*组成URL字符串*/                    //http://weather.yahooapis.com/forecastrss?w=2162312&u=c                    String queryString = "http://weather.yahooapis.com/forecastrss?w="                + city + "&u=c";                    /*将可能的空格替换为"%20"*/                    URL aURL = new URL(queryString.replace(" ", "%20"));                                    //URL aURL = new URL("http://weather.yahooapis.com/forecastrss?w=2161853&u=c");                                       /* 从SAXParserFactory获取SAXParser*/                    SAXParserFactory spf = SAXParserFactory.newInstance();                    SAXParser sp = spf.newSAXParser();                    /* 从SAXParser得到XMLReader*/                    XMLReader xr = sp.getXMLReader();                    /*                     * 创建YahooWeatherHandler,以便解析XML内容                     */                    YahooWeatherHandler ywh = new YahooWeatherHandler();                    xr.setContentHandler(ywh);                    /* 解析XML文件内容 */                    xr.parse(new InputSource(aURL.openStream()));                    /* 当前时间 */                    TextView tv1 = (TextView)findViewById(R.id.time);                    tv1.setText("当前时间:" + ywh.getCurrentTime());                                        /* 天气状况 */                    TextView tv2 = (TextView)findViewById(R.id.weather);                    tv2.setText("天气状况:" + ywh.getCurrentCondition());                                        /* 温度*/                    TextView tv3 = (TextView)findViewById(R.id.temp);                    tv3.setText("目前温度:" + ywh.getCurrentTemp());                                                             /* 获取图像地址,并显示  */                    URL iconURL = new URL(ywh.getIconURL());                    //URL iconURL = new URL("http://l.yimg.com/a/i/us/we/52/34.gif");                URLConnection conn = iconURL.openConnection();                    conn.connect();                    InputStream is = conn.getInputStream();                    BufferedInputStream bis = new BufferedInputStream(is);                    ImageView iv = (ImageView)findViewById(R.id.iconOfWeather);                    Bitmap bm = null;                    bm = BitmapFactory.decodeStream(bis);                    iv.setImageBitmap(bm);                    bis.close();                    is.close();                                        /* 清空输入框的内容 */                    EditText et = (EditText)findViewById(R.id.input);                    et.setText("");               } catch (Exception e) {                    Log.e("error",e.toString());               }        }//end of onClick        });//end of SetClick}}


3. 提取天气信息: YahooWeatherHandler.java

package com.realize.andorid.realizeforecast;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import android.util.Log;/** * SAXHandler:用户从Yahoo Weather API返回的XML中提取当前天气信息 */public class YahooWeatherHandler extends DefaultHandler {         private String current_time;     //当前时间     private String current_condition;//天气状况     private String iconURL;          //天气图像     private String current_temp;     //天气温度     private boolean in_tag = false;  //标识是否解析到“description”          public String getCurrentTime(){     return this.current_time;     }     public String getCurrentCondition(){     return this.current_condition;     }     public String getIconURL(){     return this.iconURL;     }     public String getCurrentTemp(){     return this.current_temp;     }          public void setCurrentTime(String current_time){    this.current_time = current_time;     }     public void setCurrentCondition(String condition) {         this.current_condition = condition;     }     public void setIconURL(String iconURL) {          this.iconURL = iconURL;     }     public void setCurrentTemp(String current_temp){    this.current_temp = current_temp;     }          @Override     public void startDocument() throws SAXException {        }     @Override     public void endDocument() throws SAXException {               }     @Override     public void startElement(String namespaceURI, String localName,               String qName, Attributes atts) throws SAXException {     Log.d("weather", localName);     if (localName.equals("condition"))     {     String textAttribute = atts.getValue("text");     this.setCurrentCondition(textAttribute);          String tempAttribute = atts.getValue("temp");     this.setCurrentTemp(tempAttribute);            String dateAttribute = atts.getValue("date");     this.setCurrentTime(dateAttribute);          }     else if(localName.equals("description"))     {     in_tag = true;     }     }     @Override     public void endElement(String namespaceURI, String localName, String qName)               throws SAXException {     if(localName.equals("description"))     {     in_tag = false;     }         }     @Override     public void characters(char ch[], int start, int length)      {         /** 当遇到如下结构时被调用          * <tag>characters</tag>           * <img src="http://l.yimg.com/a/i/us/we/52/34.gif"/><br />          * 提取结果为:http://l.yimg.com/a/i/us/we/52/34.gif          */     if(this.in_tag)     {     String str = new String(ch, start, length);     Log.d("characters", str);     if (str.startsWith("<img src="))  //判断字符串str 是不是以字符串"<img src="开头     {     int index2 = str.indexOf("\"/><br />");     String s2 = str.substring(10, index2);  //从str中提取字符串,从字符串str的第11个字符开始,第index2个字符结束     Log.d("test_img S2", s2);     this.setIconURL(s2);      }        }}    }


二、 验证结果

1. yahoo API 深圳天气: http://weather.yahooapis.com/forecastrss?w=2161853&u=c


2. 当没有输入城市代号,点击提交


3. 当输入“2161853”,点击提交


附:各个城市代号查询:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/

更多相关文章

  1. 阅读《Android(安卓)从入门到精通》(13)——日期选择器
  2. Android(安卓)ToastUtil
  3. android百度定位
  4. Android(安卓)App第一次启动或者更新或第一次启动
  5. 今天玩玩Android(安卓)-==-- 了解一下
  6. Android(安卓)获得当前进程PackageName
  7. android 获取屏幕的长和宽
  8. android 学习笔记有用代码片段(1)
  9. Android(安卓)HelloWorld程序

随机推荐

  1. Android中常用的五种布局
  2. Android MMS,SMS之常用Uri
  3. Android SDK 下载 链接
  4. Android获取视频音频的时长的方法
  5. android如何调用显示和隐藏系统默认的输
  6. Android的一些小问题处理
  7. Android API 中文 (42) —— ListView
  8. Android开源项目第二篇——工具库篇
  9. android中的TextView滾動條的設置
  10. Android剪裁图片简单的方法