时也担任着用户交互关键点以及交互事件接受者的角色。天气实况预报系统程序功能比较单一,其UI 也相对比较简单,只要有一个输入框、一个查询按钮以及一个显示所有中国城市信息的列表即可。为了建立Android 平台的用户界面,首先要在Package Explorer 窗口中展开Layout 后新建。xml 文件,用来对窗口界面进行布局,主要有系统运行的主配置文件main.xml 和result.xml.
Layout 是一类特殊的ViewGroup 控件,它们本身没有任何可显示内容,存在的惟一原因就是其中的内部结构,能够更好地摆放它的子控件。比如Linearlayout,可将子控件按水平或垂直方向按顺序排列下去;Tablelayout,可以将子控件按照表格的形式,一枚枚放置好;Relativelayout 更灵活,可以设定各个控件之间的对齐和排列关系,适合定制复杂的界面。有了Layout 的存在,控件和控件之间不再是割裂地存在,而是更有机地结合在一起,设定起来也更为方便。在本实例的main.xml 文件中主要是添加一些界面的布局设置,例如如下代码:
android:orientation=\
上述代码生成了一个Linearlayout,定义了一个EditText 和Button,并且设置了相关的参数。在Android 中,控件最重要的大小属性是width 要调用的方法名、命名空间以及Web Service URL值,其源代码为:
public static final String SOAP_ACTION= \);
Object result=envelope.getResponse(); xmlStr=result.toString(); } catch(Exception e) { e.printStackTrace(); }
[2] 解析数据列表
Android 操作系统对xml 字符串数据的操作功能很强,提供了dom、sax 以及xmlpul 3 种方式。Android SDK 提供了android.sax 包以方便SAX Handler 的开发,可用来解析xml 结果字符串。在本设计实例的CitiesWeatherForecast.java 文件中,解析xml 数据时,先通过RootElement root=new RootElement(\)获得xml 数据的根节点;然后再寻找其子节点直到找到City 子节点,并设置一个监听器setEndTextElementListener()来获得City 子节点的值;最后使用org.xml.sax 的SAXParser 来解析xml 数据,把数据存入List
SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser parser=factory.newSAXParser(); XMLReader xmlreader=parser.getXMLReader();
xmlreader.setContentHandler(root.getContentHandler()); InputSource is=new InputSource
(new StringBufferInputStream(xmlStr)); xmlreader.parse(is);
[3] 在UI上呈现城市列表数据
当获得List
即使用方法setListAdapter()把一个ListActivity 填充进去。
5.3 主要代码介绍
5.3.1 主界面代码(用户界面)
package com.xmobileapp.android.weatherforecast;
import java.io.StringBufferInputStream; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource; import org.xml.sax.XMLReader;
import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.sax.Element;
import android.sax.EndTextElementListener; import android.sax.RootElement; import android.util.Log; import android.view.View;
import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText;
import android.widget.ListView;
import com.xmobileapp.android.weatherforecast.meta.Constant;
import com.xmobileapp.android.weatherforecast.transport.WebServiceCaller;
public class AndroidWeatherForecast extends ListActivity {
private String cityName;
** Called when the activity is first created. *
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
Button btn = (Button) this.findViewById(R.id.searchBtn); final EditText et = (EditText) this.findViewById(R.id.cityText);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v) { }
cityName = et.getText().toString(); callWeatherResultActivity(cityName);
});
List