admin 管理员组

文章数量: 887021


2023年12月17日发(作者:mstp配置实例)

[键入公司名称]

实训课程设计

天气预报程序

xx

2011/12/29

1项目任务概述

1.1项目背景

随着3G时代的到来,移动互联网成为Internet下一个热点,android可以很好的使用Internet,获取网站上的数据,android天气预报系统就利用这一方式为用户提供服务。

天气预报的主要功能是为用户提供今日以及未来两天的天气预报。

1.2 项目任务

本项目实现在 Android移动设备天气预报功能,系统根据用户输入的地址,在Internet上请求获得该地址的天气情况,并发回数据,在系统调用该数据后,将天气实况显示给用户。

2需求分析

用户可以使用该系统实现日记的编写,修改和删除,日记内容阅读以及以文本文档形式将日记导入SDcard中。

2.1总体用例图

1 / 31

查看当日天气预报

查看未来两天天气预报

查看地理信息

图1

2.2 天气预报用例图

2.3天气预报业务流程

输入地址

查看当日天气预报

选择列表item

进入系统

进入今日预报页面

退出系统

图2

用户通过点击桌面图标,进入系统。再通过在文本框中输入的地址,来进入当天天气预报界面。再点击箭头按钮,页面跳转到未来两天天气预报的界面。

2.4 查看未来两天天气预报用例图

2 / 31

查看未来两天

天气预报

2.5 查看未来两天天气预报流程图

输入地址

选择列表item

进入系统

进入今日预报页面

点击按钮

进入明日预报界面

退出系统

图2

2.6 查看地理信息用例图

3 / 31

查看地理信息

2.7查看地理信息流程图

点击MENU

选择MENU

查看地理信息

回到系统

图3

3 系统设计

3.1 天气预报系统UI——登录界面

4 / 31

图4

3.2天气预报UI——登录界面说明

在此界面中,正如大家所见。含有两个TextView组件,一个ImageView组件,一个AutoCompleteTextView,其字符大小分别是默认的大小。其中AutoCompleteTextView能够给用户提供选项列表,用户只要单击列表中的一项,此页面就回自动跳转到下一页面。

5 / 31

3.3 天气预报UI——今日天气预报界面

图5 图6

3.4天气预报UI——今日天气预报界面说明

此界面中分别含有六个TextView组件,五个ImageView组件,一个ImageButton组件,一个Menu,在此布局文件中有五个相对布局。其中的天气图片,文字信息全部来源于/。利用Menu,用户可以查看正在搜寻的地址的地理信息。此外,该Activity加入了一个ScollView,使用户更方便地查看天气情况。同时,此页面加入了得ImageButton可以查看未来两日的天气情况。

6 / 31

3.5 天气预报UI——未来两天天气预报界面

图7

3.6 天气预报UI——未来两天天气预报界面说明

正如大家直观所见,此界面由九个TextView组件和六个ImageView组件组成。

7 / 31

3.7 天气预报UI——地理信息界面

图8 图9

3.8 天气预报UI——地理信息界面说明

如图8,图9所示,该功能用到了一个menu和一个Dialog组件。单击menu按钮,出现“地理信息”菜单,单击菜单,显示对话框。

4系统实现代码解析

4.1系统配置文件——

是系统中的配置文件,我们需要将系统中用到的Android组件全都在这个文件中注册,其中ActivityTest是启动屏幕显示的Activtiy。

代码清单1

8 / 31

package="d"

android:versionCode="1"

android:versionName="1.0">

android:name="ET">

android:label="@string/app_name">

android:label="@string/app_name">

android:name="ER" />

android:label="@string/app_name">

android:label="@string/app_name">

4.2 src代码解析

4.2.1首先,我们将要介绍的是系统的启动界面,亦即登录界面的代码。

代码清单2

package d;

import p;

import ty;

import ;

import ces;

import ;

import ;

import ;

import ;

import kListener;

import rView;

9 / 31

import ClickListener;

import SelectedListener;

import dapter;

import mpleteTextView;

import ;

import iew;

import ew;

public class ActivityTest extends Activity {

private AutoCompleteTextView m_AutoCompleteTextView;

private Button button;

private String str;

private Resources res;

private String[] autoString;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

res = getResources();

autoString = new String[] { ing(g),

ing(ai),

ing(n),

ing(ing),

ing(n),

ing(hun),

ing(ng),

ing(ote),

ing(zhuang),

ing(qi),

ing(),

ing(an),

ing(hou),

ing(),

ing(),

ing(g),

ing(u),

10 / 31

te(savedInstanceState);

setContentView();

ing(),

ing(n),

ing(),

view,

ing(g),

ing(g),

ing(g),

ing(ou),

ing(ng),

ing(hou),

ing(),

ing(),

ing(ang),

ing(),

ing(ng),

ing(),

ing(),

ing(),

ing(), };

m_AutoCompleteTextView = (AutoCompleteTextView)

findViewById(mpletetextview);

ArrayAdapter adapter = new ArrayAdapter(this,

, autoString);

m_pter(adapter);

m_AutoCompleteTextView

.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView parent, View

}

int position, long id) {

=

// TODO Auto-generated method stub

str

Intent intent = new Intent(,

);

mAtPosition(position).toString();

Bundle bundle = new Bundle();

ing("key", str);

ras(bundle);

startActivity(intent);

});

11 / 31

}

}

此类用于创建系统的登录界面。把数据放在数组中,存储在了ArrayAdapter中,AutoCompleteTextView调用了ArrayAdapter。同时,单击列表选项时,利用intent向另一个Activity传递了参数。

4.2.2现在,让我们跟随用户操作来了解下一个段代码,即当日天气预报代码。

代码清单3

package d;

import velope;

import ject;

import rializationEnvelope;

import ansportSE;

import ty;

import ialog;

import r;

import ;

import ;

import ;

import Inflater;

import ;

import flater;

import em;

import ;

import kListener;

import utton;

import iew;

import ew;

public class ActivityTest1 extends Activity {

private static final String NAMESPACE = "/";

private static final String METHOD_NAME = "getWeatherbyCityName";

private

private

static

static

String

String

URL

SOAP_ACTION

=

=

"/webservices/";

"/getWeatherbyCityName";

private static final int menu1 = 0;

12 / 31

private SoapObject detail;

TextView textview1;

TextView textview2;

TextView textview3;

TextView textview4;

TextView tv1;

TextView tv2;

ImageView image1;

ImageView image2;

String place;

ImageButton imagebutton;

Menu menu;

Dialog dialog;

String dili;

public void onCreate(Bundle savedInstanceState) {

int icon1 = parseIcon(perty(9).toString());

int icon2 = parseIcon(perty(8).toString());

13 / 31

te(savedInstanceState);

Intent intent = getIntent();

Bundle bundle = ras();

place = ing("key");

setContentView(1);

showWeather(place);

textview1 = (TextView) findViewById(ew1);

textview2 = (TextView) findViewById(ew2);

textview3 = (TextView) findViewById(ew3);

textview4 = (TextView) findViewById(ew4);

tv1 = (TextView) findViewById(1);

tv2 = (TextView) findViewById(2);

image1 = (ImageView) findViewById(1);

image2 = (ImageView) findViewById(2);

imagebutton = (ImageButton) findViewById(utton);

t(perty(5).toString());

t(perty(7).toString());

t(perty(10).toString());

t(perty(11).toString());

t(perty(1).toString());

t(perty(4).toString());

geResource(icon1);

geResource(icon2);

lickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(,

);

Bundle bundle = new Bundle();

ing("key", place);

ras(bundle);

startActivity(intent);

}

});

}

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

e(, menu);

return true;

}

public boolean onOptionsItemSelected(MenuItem item) {

int item_id = mId();

switch (item_id) {

case :

new r(this)

.setTitle("介绍")

.setView(

().inflate(

, null))

.setMessage(perty(22).toString()).create()

.show();

break;

14 / 31

}

return true;

}

private int parseIcon(String strIcon) {

// TODO Auto-generated method stub

if (strIcon == null)

return -1;

if ("".equals(strIcon))

return le.b_0;

if ("".equals(strIcon))

return le.b_1;

if ("".equals(strIcon))

return le.b_2;

if ("".equals(strIcon))

return le.b_3;

if ("".equals(strIcon))

return le.b_4;

if ("".equals(strIcon))

return le.b_5;

if ("".equals(strIcon))

return le.b_6;

if ("".equals(strIcon))

return le.b_7;

if ("".equals(strIcon))

return le.b_8;

if ("".equals(strIcon))

return le.b_9;

if ("".equals(strIcon))

return le.b_10;

if ("".equals(strIcon))

return le.b_11;

if ("".equals(strIcon))

return le.b_12;

if ("".equals(strIcon))

return le.b_13;

if ("".equals(strIcon))

return le.b_14;

if ("".equals(strIcon))

return le.b_15;

if ("".equals(strIcon))

return le.b_16;

15 / 31

}

if ("".equals(strIcon))

return le.b_17;

return le.b_18;

return le.b_19;

return le.b_20;

return le.b_21;

return le.b_22;

return le.b_23;

return le.b_24;

return le.b_25;

return le.b_26;

return le.b_27;

return le.b_28;

return le.b_29;

return le.b_30;

return le.b_31;

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

return 0;

private void showWeather(String place) {

}

private void getWeather(String place) {

16 / 31

// TODO Auto-generated method stub

getWeather(place);

// TODO Auto-generated method stub

try {

SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);

perty("theCityName", place);

}

}

HttpTransportSE ht = new HttpTransportSE(URL);

= true;

SoapSerializationEnvelope

11);

envelope = new

SoapSerializationEnvelope(

t = rpc;

= true;

putSoapObject(rpc);

(SOAP_ACTION, envelope);

SoapObject result = (SoapObject) ;

detail = (SoapObject) result

.getProperty("getWeatherbyCityNameResult");

} catch (Exception e) {

}

tackTrace();

在该段代码中,getIntent()接到了来自上一个Activity的参数。parseIcon(String strIcon)方法转换了来自网络的图片名称。GetWeather(String place)从网络上获取了该地区的天气信息。同时,

OnCreateOptionMenu(Menu menu)创建了菜单,onOptionItemSelected(MenuItem item)产生了单击菜单的事件。

4.2.3现在,让我们跟随用户操作来了解下一个段代码,即未来两日天气预报代码。

代码清单4

package d;

import velope;

import ject;

import rializationEnvelope;

import ansportSE;

import ty;

import ;

import ;

import ;

17 / 31

import kListener;

import utton;

import iew;

import ew;

public class ActivityTest2 extends Activity {

private static final String NAMESPACE = "/";

private static final String METHOD_NAME = "getWeatherbyCityName";

private static String URL

"/webservices/";

private static String SOAP_ACTION

"/getWeatherbyCityName";

private SoapObject detail;

String place;

TextView textview1;

TextView textview3;

TextView textview4;

TextView textview5;

TextView textview31;

TextView textview41;

TextView textview51;

ImageView imageview1;

ImageView imageview2;

ImageView imageview11;

ImageView imageview21;

ImageView imageview3;

ImageView imageview4;

public void onCreate(Bundle savedInstanceState) {

te(savedInstanceState);

Intent intent = getIntent();

Bundle bundle = ras();

place = ing("key");

setContentView(2);

showWeather(place);

textview1 = (TextView) findViewById(ew1);

textview3 = (TextView) findViewById(ew3);

textview4 = (TextView) findViewById(ew4);

textview5 = (TextView) findViewById(ew5);

=

=

18 / 31

textview31 = (TextView) findViewById(ew31);

textview41 = (TextView) findViewById(ew41);

textview51 = (TextView) findViewById(ew51);

t(place);

t(perty(13).toString());

t(perty(14).toString());

t(perty(12).toString());

t(perty(18).toString());

t(perty(19).toString());

t(perty(17).toString());

imageview1 = (ImageView) findViewById(iew1);

imageview2 = (ImageView) findViewById(iew2);

imageview11 = (ImageView) findViewById(iew11);

imageview21 = (ImageView) findViewById(iew21);

imageview1

imageview2

.setImageResource(parseIcon(perty(15).toString()));

.setImageResource(parseIcon(perty(16).toString()));

}

private int parseIcon(String strIcon) {

// TODO Auto-generated method stub

if (strIcon == null)

return -1;

return le.b_0;

return le.b_1;

return le.b_2;

return le.b_3;

19 / 31

geResource(parseIcon(perty(20)

.toString()));

.toString()));

geResource(parseIcon(perty(21)

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

return le.b_4;

if ("".equals(strIcon))

return le.b_5;

if ("".equals(strIcon))

return le.b_6;

if ("".equals(strIcon))

return le.b_7;

if ("".equals(strIcon))

return le.b_8;

if ("".equals(strIcon))

return le.b_9;

if ("".equals(strIcon))

return le.b_10;

if ("".equals(strIcon))

return le.b_11;

if ("".equals(strIcon))

return le.b_12;

if ("".equals(strIcon))

return le.b_13;

if ("".equals(strIcon))

return le.b_14;

if ("".equals(strIcon))

return le.b_15;

if ("".equals(strIcon))

return le.b_16;

if ("".equals(strIcon))

return le.b_17;

if ("".equals(strIcon))

return le.b_18;

if ("".equals(strIcon))

return le.b_19;

if ("".equals(strIcon))

return le.b_20;

if ("".equals(strIcon))

return le.b_21;

if ("".equals(strIcon))

return le.b_22;

if ("".equals(strIcon))

return le.b_23;

if ("".equals(strIcon))

return le.b_24;

if ("".equals(strIcon))

return le.b_25;

20 / 31

}

if ("".equals(strIcon))

return le.b_26;

return le.b_27;

return le.b_28;

return le.b_29;

return le.b_30;

return le.b_31;

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

if ("".equals(strIcon))

return 0;

private void showWeather(String place) {

}

private void getWeather(String place) {

// TODO Auto-generated method stub

try {

SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);

perty("theCityName", place);

HttpTransportSE ht = new HttpTransportSE(URL);

= true;

SoapSerializationEnvelope

11);

envelope = new

// TODO Auto-generated method stub

getWeather(place);

SoapSerializationEnvelope(

t = rpc;

= true;

putSoapObject(rpc);

(SOAP_ACTION, envelope);

SoapObject result = (SoapObject) ;

detail = (SoapObject) result

.getProperty("getWeatherbyCityNameResult");

} catch (Exception e) {

tackTrace();

21 / 31

}

}

}

用showWeather()来显示从网站获得的天气信息。

4.3 layout代码解析:

:

登陆界面布局文件

xmlns:android="/apk/res/android"

22 / 31

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:layout_height="200dip">

android:layout_width="wrap_content"

android:background="@drawable/welcome4"

android:layout_alignParentLeft="true" />

android:background="@drawable/whitebackground">

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="60dip"

android:layout_height="wrap_content"

android:text="Tianer说~~天气" android:textSize="25dip"

android:layout_toRightOf="@id/imageview1"

android:layout_alignParentRight="true"

android:layout_alignParentBottom="true" />

android:layout_width="wrap_content"

android:textColor="#808080ff"

android:orientation="vertical"

android:layout_height="wrap_content">

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_width="100dip"

android:text="@string/hello"

android:textSize="15dip" />

android:layout_width="200dip"

android:layout_toRightOf="@id/textview2"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_height="wrap_content"

android:completionThreshold="1"

android:layout_centerHorizontal="true">

:

当日天气预报界面布局文件

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_height="wrap_content">

23 / 31

android:id="@+id/scrollview" android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:orientation="vertical"

android:layout_height="match_parent" android:id="@+id/main1"

android:background="@drawable/white">

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

xmlns:android="/apk/res/android"

android:layout_width="wrap_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:textSize="50dip" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="60dip"

android:layout_alignParentRight="true"

android:layout_toRightOf="@id/tv1"

android:textSize="15dip" />

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerHorizontal="true" />

android:id="@+id/image2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/image1"

android:layout_alignParentRight="true" />

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="50dip"

android:layout_marginTop="20dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/tem11"

android:layout_alignParentLeft="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

24 / 31

android:layout_toRightOf="@id/imageview1"

android:layout_alignParentRight="true"

android:layout_marginLeft="10dip"

android:textColor="#808080ff" />

xmlns:android="/apk/res/android" android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="50dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/tem22"

android:layout_alignParentLeft="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_marginLeft="10dip"

android:layout_toRightOf="@id/imageview2"

android:textColor="#808080ff" />

xmlns:android="/apk/res/android" android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/maike1"

android:layout_alignParentTop="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="20dip"

android:layout_below="@id/imageview3"

android:textColor="#808080ff" />

25 / 31

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:textColor="#808080ff" />

android:layout_width="wrap_content"

android:layout_below="@id/textview3"

android:layout_width="wrap_content"

android:layout_alignParentLeft="true" android:text="未来两日android:id="@+id/textviewdi"

android:layout_height="wrap_content"

天气,请点击------">

android:layout_width="wrap_content"

android:id="@+id/imagebutton"

android:layout_alignParentRight="true"

android:clickable="true">

android:layout_height="wrap_content"

android:background="@drawable/jiantou"

android:layout_toRightOf="@id/textviewdi"

:

未来两日天气预报布局文件

xmlns:android="/apk/res/android"

android:id="@+id/scrollview" android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:orientation="vertical"

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

26 / 31

android:layout_height="match_parent" android:id="@+id/main1"

android:background="@drawable/white">

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:textSize="50dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="20dip"

android:textSize="20dip">

xmlns:android="/apk/res/android"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical"

android:id="@+id/relativelayout">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="50dip"

android:layout_alignParentLeft="true">

android:layout_toRightOf="@id/imageview1"

android:layout_alignParentRight="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="15dip"

android:layout_marginLeft="102dip">

android:layout_height="wrap_content"

android:layout_marginTop="10dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:background="@drawable/tem22">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

27 / 31

android:textSize="15dip"

android:layout_width="wrap_content"

android:layout_marginTop="20dip"

android:layout_width="wrap_content"

android:layout_alignParentLeft="true"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/imageview3"

android:layout_alignParentRight="true"

android:layout_marginLeft="20dip">

android:layout_marginTop="10dip">

android:layout_height="wrap_content"

android:background="@drawable/tem11">

android:layout_height="wrap_content"

android:layout_toRightOf="@id/imageview4"

android:layout_width="wrap_content"

android:textSize="15dip"

android:layout_marginLeft="20dip">

android:layout_height="wrap_content"

android:textSize="20dip">

android:layout_width="wrap_content"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_marginLeft="50dip"

xmlns:android="/apk/res/android"

android:layout_height="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true">

android:layout_toRightOf="@id/imageview11"

android:layout_alignParentRight="true"

android:layout_height="wrap_content">

28 / 31

android:layout_width="wrap_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="15dip"

android:layout_marginLeft="102dip">

android:layout_height="wrap_content"

android:layout_marginTop="10dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:background="@drawable/tem22">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="15dip"

android:layout_toRightOf="@id/imageview31"

android:layout_alignParentRight="true"

android:layout_marginLeft="20dip">

android:layout_height="wrap_content"

android:layout_marginTop="10dip">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:background="@drawable/tem11">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="15dip"

android:layout_toRightOf="@id/imageview41"

android:layout_marginLeft="20dip">

:

地理信息对话框布局文件

29 / 31

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:orientation="vertical">

android:layout_height="wrap_content">

android:layout_height="match_parent"

:

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:padding="10dp"

android:textSize="16sp"

android:textColor="#000">

4.4 menu代码解析:

:

地理信息菜单布局文件

xmlns:android="/apk/res/android">

android:title="地理信息">

5 总结

在本系统中主要涉及到的技术有:

5.1 Activity和Activity之间的跳转,并且需要传递数值

5.2 TextView组件的使用.

5.3对话框,复杂的布局的对话框,页面的布局来源于一个布局XML文件,当然也可以在Activity中采用硬编码的方式实现。XML文件描述的布局直观而简洁。但当对话框中的布局不是太过复杂的时候为了节省空间及时间,将采用硬编码方式编写。

6.4菜单的编写,菜单可以提供功能选择的效果,同时节省本就不富裕的界面空间。

30 / 31


本文标签: 系统 天气预报 界面 用户