WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术程序开发基于MIDP1.0实现通信录

基于MIDP1.0实现通信录
作者:詹建飞  来源:J2MEDV  发布时间:2005-9-7 13:08:14
item的内容发生变化的时候告诉应用程序去执行相应的操作,例如当TextField中用户输入了姓名,那么应用程序去RMS中去查询相关的记录并返回。例如
public void itemStateChanged(Item item)
{
if(item == inputField)
{
String userName = inputField.getString();
if(userName.length()!= 0)
{
uicontroller.handleEvent(UIController.EventID.EVENT_SEARCH_RECORD,new Object[]{userName});
}
}
}
MIDP中的低级事件处理是通过实现Canvas类的相关方法来实现的,例如当用户按下某个按键,应用程序应该去处理相应的操作。由于个人通信录中并未涉及相关内容因此不做讲解。

  • 应用MVC设计模式实现界面导航

MIDP中的UI类使用起来比不难,然而界面导航问题却并不容易解决,事实上它是困扰很多J2ME程序员的问题。在MIDP中我们只能通过调用Display类中的setCurrent()方法来实现不同界面之间的切换,如果界面多起来比如有8-10个界面的时候就会显得非常的麻烦。你也许想构造一个树形的结构来记录每个界面的父亲界面例如:
public ChildUI(Displayable parent,Dispaly display)
{
this.parent = parent;
this.display = display;
}
但是当界面以及相互之间的联系增加的时候,界面的导航问题仍然是一个噩梦。MVC设计模式在Web Application应用开发方面已经被证明是非常成功的,例如Apache的开源项目struts,在本文中我将讲述如何应用MVC设计模式解决MIDP应用程序的界面导航问题。
MVC的目的就是实现显示(View)与逻辑(Model)的分离,而在其中起到重要作用的就是控制器(Controller)。在控制器内通常我们要定义一些事件的代号以便和UI类通信,保证正确处理相应的事件,我们可以使用内部类来标记这些事件的代号。
public static class EventID
{
private EventID()
{
}

public static final byte EVENT_NEW_RECORD_SELECTED = 1;
public static final byte EVENT_SAVE_RECORD_SELECTED = 2;
public static final byte EVENT_NEWPHONE_BACK_MAINUI = 3;
public static final byte EVENT_LISTPHONE_BACK_MAINUI = 4;
public static final byte EVENT_SEARCHUI_BACK_MAINNUI = 5;
public static final byte EVENT_CLEAR_RECORD_YES = 6;
public static final byte EVENT_CLEAR_RECORD_NO = 7;
public static final byte EVENT_DELETE_RECORD = 8;
public static final byte EVENT_DELETE_RECORD_YES = 9;
public static final byte EVENT_DELETE_RECORD_NO = 10;
public static final byte EVENT_DISPLAY_INFOMATION = 11;
public static final byte EVENT_DETAIL_BACK_LIST = 12;
public static final byte EVENT_SEARCH_RECORD = 13;
public static final byte EVENT_SEARCH_RECORD_ANYWAY = 14;

public static final byte ADD_NEW_RECORD = 100;
public static final byte SEARCH_RECORD = 101;
public static final byte CLEAR_RECORD = 102;
public static final byte LIST_RECORD = 103;
public static final byte HELP = 104;
}


当UI类中有事件发生的时候它可以向UIController类传输事件的代码,UIController类根据代码来进行相应的事件处理。例如:
if (arg0 == backCommand)
{
uicontroller.handleEvent(UIController.EventID.EVENT_NEWPHONE_BACK_MAINUI)
}
UIController的handleEvent()方法则在接收到UI类的请求之后调用Model类的相关方法得到响应,然后再显示相关的界面。
public void handleEvent(int eventID)
{
switch (eventID)
{
case EventID.ADD_NEW_RECORD:
{
newPhoneUI.clear();
display.setCurrent(newPhoneUI);
break;
}

case EventID.CLEAR_RECORD:
{
dialog.setMessage(Title.delete_phonebook);
dialog.display(EventID.CLEAR_RECORD);
break;
}

case EventID.EVENT_CLEAR_RECORD_YES:
{
try
{
model.clearAllRecord();
display.setCurrent(indexFunctionUI);
} catch (ApplicationException e)
{
e.printStackTrace();
}
break;
}
……
……
}
有的时候我们不光要告诉控制类要做什么还要传输给他一些从界面类采集到的数据,这时候我们可以在UIController类中重载handleEvent()方法,添加一个Object[]类型的参数来接收数据,如下所示:

public void handleEvent(int eventID, Object[] obj)
{
switch (eventID)
{
case EventID.EVENT_SAVE_RECORD_SELECTED:
{
try
{
Account account = (Account) obj[0];
if (model.isRecordExist(account.getUserName()))
{
showAlert(Title.record_exist, indexFunctionUI,
AlertType.WARNING);
} else
{
model.addRecord(account);

showAlert(Title.record_added, indexFunctionUI,
AlertType.CONFIRMATION);
}
} catch (ApplicationException e)
{
e.printStackTrace();
}
break;
}
}
}
例如在添加新电话记录的时候,我们可以这样实现commandAction()方法向UIController传送消息。
if (arg0 == saveCommand)
{
……
……
Account newAccount = new Account(userName, mobilePhone, phone,
email);
uicontroller.handleEvent(
UIController.EventID.EVENT_SAVE_RECORD_SELECTED,
new Object[] { newAccount });
}
我们很难保证用户输入的数据有效,也很难保证用户的操作都合理,因此我们必须针对用户的不合理的操作给出相对的提示或者警告。在javax.microedition.lcdui包中Alert类能够很好的完成这个任务,因此我们自己提供一个方法如下所示:
public void showAlert(String message, Displayable next, AlertType type)
{
alert = new Alert(Title.alertTitle, message, null, type);
alert.setTimeout(1500);
setCurrent(alert, next);
}
当不合理的事件发生的时候我们应该调用它。
String userName = nameField.getString();
if (userName.length() == 0)
{
uicontroller.showAlert(Title.userNameNull, this,AlertType.WARNING);
return;
}
例如当用户并没有输入姓名就按下了保存的按钮的时候,应该提示用户“用户名不能为空”。

有些时候,某些操作可能会被堵塞,例如联网或者

上一页  [1] [2] [3]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码