在編寫手機程序時,經常要進行各個屏幕間的切換。一開始不知道怎麼樣去做,這兩天看了一個例子,很簡單,但很能說明問題。總結一下。如有不妥之外,請高手糾正!
功能:在主程序中有多個按鈕,每一個按鈕對應一個功能,每一個功能要不同的屏幕(元素)表現出來。
實現:
一、主程序中必然定義了一個Display對像,如private Display display,它表示當前的屏幕。還有一些Displayable對像。如Form,TextFIEld等都是Displayable的子類。在主程序中通過dipslay.serCurrent(Displayable實例名); 即可將當Displayable實例加入當前的屏幕。以下程序:
private Display display;
private Form form = new Form(“一個Form“);
public void startApp()
{
display.setCurrent(form);
}
作用是將form添加到當前的屏幕當中。
二、要想進行屏幕間的切換,只要將你想顯示的東東放到到主程序的display對象中即可。主程序中定義了一個display,則要在另一個屏幕(我姑且把它稱之為目標屏幕)中引用到主程序的display。
開發環境:Win2000 server+Eclipse+WTK2.1
用以下代碼說明:
MainMIDlet.Java:主程序,一個標准的MIDlet。
import Javax.microedition.midlet.MIDlet;
import Javax.microedition.lcdui.*;
public class MainMIDlet extends MIDlet implements CommandListener {
private Display display;
private Form form = new Form("Wellcome!!");
private Command okCommand = new Command("OK",Command.OK,1);//選擇OK,換到下一個屏幕
private Form ns ;
private StringItem si = new StringItem("First Screen","~_~");
public MainMIDlet()
{
form.addCommand(okCommand);
form.append(si);
}
public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(form);
form.setCommandListener(this);//對form加入CommandListener
}
public void pauseApp() {
}
public void destroyApp(boolean b){
}
public void commandAction(Command c,Displayable s)
{
if(c==okCommand)
{
ns = new NextScreen(display,form);//最關鍵的地方在這裡:)
display.setCurrent(ns);
}
}
}
在這個MIDlet中,定義了一個Display對像display。
以及一個兩個Displayable對象Form form及StringItem si。運行後顯示在屏幕當中。
還有個一Command okCommand,其作用是觸發下一個屏幕。
在public void commandListener中可以看到,當當前按下的按鈕是okCommand時,初始化一個NextScreen對象
ns = new NextScreen(display,form);
將display和form傳入,作用就是進行屏幕的切換。
下面是NextScreen的實現:
NextScreen.Java 第二個屏幕的代碼
import Javax.microedition.lcdui.*;
public class NextScreen extends Form implements CommandListener {
private Display display;
private Displayable parent;
private Command backCommand = new Command("BACK",Command.BACK,1);
private StringItem si = new StringItem("SecondScrean","~_~");
public NextScreen(Display d,Displayable p)
{
super("nextscreen");
display = d;
parent = p;
append(si);
addCommand(backCommand);
setCommandListener(this);
}
public void commandAction(Command c,Displayable s)
{
//返回上一個屏幕
if(c==backCommand)
{
display.setCurrent(parent);
}
}
}
它繼承自Form類。
在NextScreen中又定義了一個Display display,將用它來標識當前的元素顯示在哪一個屏幕中。
一個Form form,一個StringItem si。這是當前屏幕中要顯示的東東:)
構造函數中的super("secondscreen");的作用是使得NextScreen可以直接調中其父類Form中的函數。
backCommand的作用是返回上一個屏幕。
將form,si及backCommand加入NextScreen中,一個NextScreen的實例就完成了。在主程序(MainMIDlet)中,就是ns。
接下來,最關鍵的地方,就是在MainMIDlet中的這一句:display.setCurrent(ns);
就是把ns在當前的屏幕中顯示出來!這樣就可以看到NextScreen中定義的各個元素(form,si)了!
然後想返回原屏幕,怎麼辦呢?這時NextScreen中的backCommand就起作用了。
仔細看這兩句:
在MainMIDlet.Java中:
ns = new NextScreen(display,form);
它將form也傳了進去。它有什麼用呢?
在NextScreen的構造函數中:
dispaly =d;
這一句其實等於:NextScreen.display = MainMIDlet.display;
這樣,NextScreen就得到了當前的屏幕,它就隨意的在上面放東東了。
parent = p;
這一句其實等於:NextScreen.parent = MainMIDlet.form;
從字面意思不難理解,原來是把主程序的form當成parent(父母),這樣就得到當前屏幕的前一個屏幕中所顯示的內容!!
然後在commandAction中,如果backCommand按下了,則執行display.serCurrent(parent);這樣,又把原來的屏幕給show出來了:)