事先声明,这个代码是《疯狂android讲义》上的,我只不过动手打了一遍,有些地方是拷贝的
布局文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="@string/province" />
- <!-- 让用户选择省份的Spinner -->
- <Spinner
- android:id="@+id/province"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="@string/city" />
- <!-- 让用户选择城市的Spinner -->
- <Spinner
- android:id="@+id/city"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <!-- 显示今天天气的图片和文本框 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <ImageView
- android:id="@+id/todayWhIcon1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/todayWhIcon2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/weatherToday"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- </LinearLayout>
- <!-- 显示明天天气的图片和文本框 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <ImageView
- android:id="@+id/tomorrowWhIcon1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/tomorrowWhIcon2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/weatherTomorrow"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- </LinearLayout>
- <!-- 显示后天天气的图片和文本框 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <ImageView
- android:id="@+id/afterdayWhIcon1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/afterdayWhIcon2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/weatherAfterday"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- </LinearLayout>
- <TextView
- android:id="@+id/weatherCurrent"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
主要activity文件
- package com.example.weatherservicedemo;
- import java.util.List;
- import org.ksoap2.serialization.SoapObject;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemSelectedListener;
- import android.widget.ImageView;
- import android.widget.Spinner;
- import android.widget.TextView;
- /**
- * Description: <br/>
- * site: <a href="http://www.crazyit.org">crazyit.org</a> <br/>
- * Copyright (C), 2001-2012, Yeeku.H.Lee <br/>
- * This program is protected by copyright laws. <br/>
- * Program Name: <br/>
- * Date:
- *
- * @author Yeeku.H.Lee kongyeeku@163.com
- * @version 1.0
- */
- public class MyWeather extends Activity {
- private Spinner provinceSpinner;
- private Spinner citySpinner;
- private ImageView todayWhIcon1;
- private ImageView todayWhIcon2;
- private TextView textWeatherToday;
- private ImageView tomorrowWhIcon1;
- private ImageView tomorrowWhIcon2;
- private TextView textWeatherTomorrow;
- private ImageView afterdayWhIcon1;
- private ImageView afterdayWhIcon2;
- private TextView textWeatherAfterday;
- private TextView textWeatherCurrent;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- todayWhIcon1 = (ImageView) findViewById(R.id.todayWhIcon1);
- todayWhIcon2 = (ImageView) findViewById(R.id.todayWhIcon2);
- textWeatherToday = (TextView) findViewById(R.id.weatherToday);
- tomorrowWhIcon1 = (ImageView) findViewById(R.id.tomorrowWhIcon1);
- tomorrowWhIcon2 = (ImageView) findViewById(R.id.tomorrowWhIcon2);
- textWeatherTomorrow = (TextView) findViewById(R.id.weatherTomorrow);
- afterdayWhIcon1 = (ImageView) findViewById(R.id.afterdayWhIcon1);
- afterdayWhIcon2 = (ImageView) findViewById(R.id.afterdayWhIcon2);
- textWeatherAfterday = (TextView) findViewById(R.id.weatherAfterday);
- textWeatherCurrent = (TextView) findViewById(R.id.weatherCurrent);
- // 获取程序界面中选择省份、城市的Spinner组件
- provinceSpinner = (Spinner) findViewById(R.id.province);
- citySpinner = (Spinner) findViewById(R.id.city);
- // 调用远程Web Service获取省份列表
- List<String> provinces = WebServiceUtil.getProvinceList();
- ListAdapter adapter = new ListAdapter(this, provinces);
- // 使用Spinner显示省份列表
- provinceSpinner.setAdapter(adapter);
- // 当省份Spinner的选择项被改变时
- provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
- public void onItemSelected(AdapterView<?> source, View parent,
- int position, long id) {
- List<String> cities = WebServiceUtil
- .getCityListByProvince(provinceSpinner
- .getSelectedItem().toString());
- ListAdapter cityAdapter = new ListAdapter(MyWeather.this,
- cities);
- // 使用Spinner显示城市列表
- citySpinner.setAdapter(cityAdapter);
- }
- public void onNothingSelected(AdapterView<?> arg0) {
- }
- });
- // 当城市Spinner的选择项被改变时
- citySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
- public void onItemSelected(AdapterView<?> source, View parent,
- int position, long id) {
- showWeather(citySpinner.getSelectedItem().toString());
- }
- public void onNothingSelected(AdapterView<?> arg0) {
- }
- });
- }
- private void showWeather(String city) {
- String weatherToday = null;
- String weatherTomorrow = null;
- String weatherAfterday = null;
- String weatherCurrent = null;
- int iconToday[] = new int[2];
- int iconTomorrow[] = new int[2];
- int iconAfterday[] = new int[2];
- // 获取远程Web Service返回的对象
- SoapObject detail = WebServiceUtil.getWeatherByCity(city);
- // 获取天气实况
- weatherCurrent = detail.getProperty(4).toString();
- // 解析今天的天气情况
- String date = detail.getProperty(7).toString();
- weatherToday = "今天:" + date.split(" ")[0];
- weatherToday = weatherToday + "\n天气:" + date.split(" ")[1];
- weatherToday = weatherToday + "\n气温:"
- + detail.getProperty(8).toString();
- weatherToday = weatherToday + "\n风力:"
- + detail.getProperty(9).toString() + "\n";
- iconToday[0] = parseIcon(detail.getProperty(10).toString());
- iconToday[1] = parseIcon(detail.getProperty(11).toString());
- // 解析明天的天气情况
- date = detail.getProperty(12).toString();
- weatherTomorrow = "明天:" + date.split(" ")[0];
- weatherTomorrow = weatherTomorrow + "\n天气:" + date.split(" ")[1];
- weatherTomorrow = weatherTomorrow + "\n气温:"
- + detail.getProperty(13).toString();
- weatherTomorrow = weatherTomorrow + "\n风力:"
- + detail.getProperty(14).toString() + "\n";
- iconTomorrow[0] = parseIcon(detail.getProperty(15).toString());
- iconTomorrow[1] = parseIcon(detail.getProperty(16).toString());
- // 解析后天的天气情况
- date = detail.getProperty(17).toString();
- weatherAfterday = "后天:" + date.split(" ")[0];
- weatherAfterday = weatherAfterday + "\n天气:" + date.split(" ")[1];
- weatherAfterday = weatherAfterday + "\n气温:"
- + detail.getProperty(18).toString();
- weatherAfterday = weatherAfterday + "\n风力:"
- + detail.getProperty(19).toString() + "\n";
- iconAfterday[0] = parseIcon(detail.getProperty(20).toString());
- iconAfterday[1] = parseIcon(detail.getProperty(21).toString());
- // 更新当天的天气实况
- textWeatherCurrent.setText(weatherCurrent);
- // 更新显示今天天气的图标和文本框
- textWeatherToday.setText(weatherToday);
- todayWhIcon1.setImageResource(iconToday[0]);
- todayWhIcon2.setImageResource(iconToday[1]);
- // 更新显示明天天气的图标和文本框
- textWeatherTomorrow.setText(weatherTomorrow);
- tomorrowWhIcon1.setImageResource(iconTomorrow[0]);
- tomorrowWhIcon2.setImageResource(iconTomorrow[1]);
- // 更新显示后天天气的图标和文本框
- textWeatherAfterday.setText(weatherAfterday);
- afterdayWhIcon1.setImageResource(iconAfterday[0]);
- afterdayWhIcon2.setImageResource(iconAfterday[1]);
- }
- // 工具方法,该方法负责把返回的天气图标字符串,转换为程序的图片资源ID。
- private int parseIcon(String strIcon) {
- if (strIcon == null)
- return -1;
- if ("0.gif".equals(strIcon))
- return R.drawable.a_0;
- if ("1.gif".equals(strIcon))
- return R.drawable.a_1;
- if ("2.gif".equals(strIcon))
- return R.drawable.a_2;
- if ("3.gif".equals(strIcon))
- return R.drawable.a_3;
- if ("4.gif".equals(strIcon))
- return R.drawable.a_4;
- if ("5.gif".equals(strIcon))
- return R.drawable.a_5;
- if ("6.gif".equals(strIcon))
- return R.drawable.a_6;
- if ("7.gif".equals(strIcon))
- return R.drawable.a_7;
- if ("8.gif".equals(strIcon))
- return R.drawable.a_8;
- if ("9.gif".equals(strIcon))
- return R.drawable.a_9;
- if ("10.gif".equals(strIcon))
- return R.drawable.a_10;
- if ("11.gif".equals(strIcon))
- return R.drawable.a_11;
- if ("12.gif".equals(strIcon))
- return R.drawable.a_12;
- if ("13.gif".equals(strIcon))
- return R.drawable.a_13;
- if ("14.gif".equals(strIcon))
- return R.drawable.a_14;
- if ("15.gif".equals(strIcon))
- return R.drawable.a_15;
- if ("16.gif".equals(strIcon))
- return R.drawable.a_16;
- if ("17.gif".equals(strIcon))
- return R.drawable.a_17;
- if ("18.gif".equals(strIcon))
- return R.drawable.a_18;
- if ("19.gif".equals(strIcon))
- return R.drawable.a_19;
- if ("20.gif".equals(strIcon))
- return R.drawable.a_20;
- if ("21.gif".equals(strIcon))
- return R.drawable.a_21;
- if ("22.gif".equals(strIcon))
- return R.drawable.a_22;
- if ("23.gif".equals(strIcon))
- return R.drawable.a_23;
- if ("24.gif".equals(strIcon))
- return R.drawable.a_24;
- if ("25.gif".equals(strIcon))
- return R.drawable.a_25;
- if ("26.gif".equals(strIcon))
- return R.drawable.a_26;
- if ("27.gif".equals(strIcon))
- return R.drawable.a_27;
- if ("28.gif".equals(strIcon))
- return R.drawable.a_28;
- if ("29.gif".equals(strIcon))
- return R.drawable.a_29;
- if ("30.gif".equals(strIcon))
- return R.drawable.a_30;
- if ("31.gif".equals(strIcon))
- return R.drawable.a_31;
- return 0;
- }
- }
帮助文件
- package com.example.weatherservicedemo;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import org.ksoap2.SoapEnvelope;
- import org.ksoap2.serialization.SoapObject;
- import org.ksoap2.serialization.SoapSerializationEnvelope;
- import org.ksoap2.transport.HttpTransportSE;
- import org.xmlpull.v1.XmlPullParserException;
- /**
- * Description: <br/>
- * 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> <br/>
- * Copyright (C), 2001-2012, Yeeku.H.Lee <br/>
- * This program is protected by copyright laws. <br/>
- * Program Name: <br/>
- * Date:
- *
- * @author Yeeku.H.Lee kongyeeku@163.com
- * @version 1.0
- */
- public class WebServiceUtil {
- // 定义Web Service的命名空间
- static final String SERVICE_NS = "http://WebXml.com.cn/";
- // 定义Web Service提供服务的URL
- static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
- // 调用远程Web Service获取省份列表
- public static List<String> getProvinceList() {
- // 调用的方法
- String methodName = "getRegionProvince";
- // 创建HttpTransportSE传输对象
- HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- // 使用SOAP1.1协议创建Envelop对象
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- // 实例化SoapObject对象
- SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
- envelope.bodyOut = soapObject;
- // 设置与.Net提供的Web Service保持较好的兼容性
- envelope.dotNet = true;
- try {
- // 调用Web Service
- ht.call(SERVICE_NS + methodName, envelope);
- if (envelope.getResponse() != null) {
- // 获取服务器响应返回的SOAP消息
- SoapObject result = (SoapObject) envelope.bodyIn;
- SoapObject detail = (SoapObject) result.getProperty(methodName
- + "Result");
- // 解析服务器响应的SOAP消息。
- return parseProvinceOrCity(detail);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- }
- return null;
- }
- // 根据省份获取城市列表
- public static List<String> getCityListByProvince(String province) {
- // 调用的方法
- String methodName = "getSupportCityString";
- // 创建HttpTransportSE传输对象
- HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- // 实例化SoapObject对象
- SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
- // 添加一个请求参数
- soapObject.addProperty("theRegionCode", province);
- // 使用SOAP1.1协议创建Envelop对象
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- envelope.bodyOut = soapObject;
- // 设置与.Net提供的Web Service保持较好的兼容性
- envelope.dotNet = true;
- try {
- // 调用Web Service
- ht.call(SERVICE_NS + methodName, envelope);
- if (envelope.getResponse() != null) {
- // 获取服务器响应返回的SOAP消息
- SoapObject result = (SoapObject) envelope.bodyIn;
- SoapObject detail = (SoapObject) result.getProperty(methodName
- + "Result");
- // 解析服务器响应的SOAP消息。
- return parseProvinceOrCity(detail);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- }
- return null;
- }
- private static List<String> parseProvinceOrCity(SoapObject detail) {
- ArrayList<String> result = new ArrayList<String>();
- for (int i = 0; i < detail.getPropertyCount(); i++) {
- // 解析出每个省份
- result.add(detail.getProperty(i).toString().split(",")[0]);
- }
- return result;
- }
- public static SoapObject getWeatherByCity(String cityName) {
- String methodName = "getWeather";
- HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
- soapObject.addProperty("theCityCode", cityName);
- envelope.bodyOut = soapObject;
- // 设置与.Net提供的Web Service保持较好的兼容性
- envelope.dotNet = true;
- try {
- ht.call(SERVICE_NS + methodName, envelope);
- SoapObject result = (SoapObject) envelope.bodyIn;
- SoapObject detail = (SoapObject) result.getProperty(methodName
- + "Result");
- return detail;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
适配器文件
- package com.example.weatherservicedemo;
- import java.util.List;
- import android.content.Context;
- import android.graphics.Color;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.TextView;
- /**
- * Description: <br/>
- * 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> <br/>
- * Copyright (C), 2001-2012, Yeeku.H.Lee <br/>
- * This program is protected by copyright laws. <br/>
- * Program Name: <br/>
- * Date:
- *
- * @author Yeeku.H.Lee kongyeeku@163.com
- * @version 1.0
- */
- public class ListAdapter extends BaseAdapter {
- private Context context;
- private List<String> values;
- public ListAdapter(Context context, List<String> values) {
- this.context = context;
- this.values = values;
- }
- public int getCount() {
- return values.size();
- }
- public Object getItem(int position) {
- return values.get(position);
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView text = new TextView(context);
- text.setText(values.get(position));
- text.setTextSize(20);
- text.setTextColor(Color.BLACK);
- return text;
- }
- }
还有访问网络的权限呀,事先说明一下,这个只有在wif下运行成功,移动网络运行失败,不知道怎么回事,有明白的,给哥们呢我留个言,大恩不言谢呀。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.weatherservicedemo"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk android:minSdkVersion="8" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name=".MyWeather"
- android:label="@string/title_activity_main" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
后面我会把源代码上传,因为还有一个架包没办法贴出来。也可以百度搜索一下,ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar架包
运行的时候可能会有no class not found 的错误,说找不到那个类文件,告诉你一个解决的办法,如下图
也可以看这篇文章解决---http://blog.csdn.net/wang6279026/article/details/8098100