UI设计
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/province" />
<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"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/city" />
<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>
ListAdapter
package com.example.dashu_weather;
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;
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;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return values.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return values.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
TextView text = new TextView(context);
text.setText(values.get(arg0));
text.setTextSize(20);
text.setTextColor(Color.GREEN);
return text;
}
}
WebServiceUtil
package com.example.dashu_weather;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
public class WebServiceUtil {
// 定义Web Service命名空间
static final String SERVICE_NS = "http://WebXml.com.cn/";
// Web Services服务的URL
static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
/**
* 调用远程Web Service获取省份列表
* */
public static List<String> getProvinceList() {
// 调用Wbe Services服务的方法名
final String methodName = "getRegionProvince";
// 创建HttpTransportSE传输对象,该对象用于调用wbe services
final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
// 使用SOAP1.1协议创建envelope对象,该对象是HttpTransportSE调用web service信息载体
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 实例化SoapObject对象,参数命名空间和调用的方法名字
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
// 客户端通过SoapSerializationEnvelope类对象的envelope.bodyOut把客户端要输入的参数传给服务器,即soapObject对象
envelope.bodyOut = soapObject;
// 设置与.net提供的web services保持良好的兼容性
envelope.dotNet = true;
FutureTask<List<String>> task = new FutureTask<List<String>>(
new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
// 调用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");
// 解析服务器响应的消息
return parseProvinceOrCity(detail);
}
return null;
}
});
new Thread(task).start();
try {
return task.get();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取省份城市列表
* */
public static List<String> getCityListByProvince(String province) {
// 调用Wbe Services服务的方法名
final String methodName = "getSupportCityString";
// 创建HttpTransportSE传输对象,该对象用于调用wbe services
final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
// 使用SOAP1.1协议创建envelope对象,该对象是HttpTransportSE调用web service信息载体
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 实例化SoapObject对象,参数命名空间和调用的方法名字
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
// 添加一个请求参数
soapObject.addProperty("theRegionCode", province);
// 客户端通过SoapSerializationEnvelope类对象的envelope.bodyOut把客户端要输入的参数传给服务器,即soapObject对象
envelope.bodyOut = soapObject;
// 设置与.net提供的web services保持良好的兼容性
envelope.dotNet = true;
FutureTask<List<String>> task = new FutureTask<List<String>>(
new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
// 调用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");
// 解析服务器响应的消息
return parseProvinceOrCity(detail);
}
return null;
}
});
new Thread(task).start();
try {
return task.get();
} catch (Exception 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) {
final String methodName = "getWeather";
final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
final 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;
FutureTask<SoapObject> task = new FutureTask<SoapObject>(
new Callable<SoapObject>() {
@Override
public SoapObject call() throws Exception {
ht.call(SERVICE_NS + methodName, envelope);
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result
.getProperty(methodName + "Result");
return detail;
}
});
new Thread(task).start();
try {
return task.get();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
MainActivity
package com.example.dashu_weather;
import java.util.List;
import com.example.dashu_weather.R;
import com.example.dashu_weather.WebServiceUtil;
import org.ksoap2.serialization.SoapObject;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity 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
protected 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() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
List<String> cities = WebServiceUtil
.getCityListByProvince(provinceSpinner
.getSelectedItem().toString());
ListAdapter cityAdapter = new ListAdapter(MainActivity.this,
cities);
// 使用Spinner显示城市列表
citySpinner.setAdapter(cityAdapter);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
citySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
showWeather(citySpinner.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
}
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;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
manifest加网络访问权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dashu_weather"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.dashu_weather.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- 网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
</manifest>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">天气预报</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="btn_apply">查询</string>
<string name="text_hint">城市中文名</string>
<string name="province">省份</string>
<string name="city">城市</string>
</resources>