Display:每個 MIDlet 單例,代表裝置顯示管理器,Display.getDisplay(this) 取得Displayable:可顯示介面的父介面,Form、Canvas、List、TextBox、Alert 皆實作此介面display.setCurrent(Displayable next)
// 主 MIDlet 中
private Display display;
private Form mainForm = new Form("主選單");
public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(mainForm); // 顯示主選單
}
// 切換至子畫面(如設定頁)
private Form settingsForm = new Form("設定");
public void showSettings() {
display.setCurrent(settingsForm);
}
子畫面需要知道「從哪裡來、回哪裡去」。標準做法是建構子傳遞父畫面引用:
// 子畫面類別
public class SettingsScreen extends Form {
private Display display;
private Displayable parent; // 父畫面引用
public SettingsScreen(Display display, Displayable parent) {
super("設定");
this.display = display;
this.parent = parent; // 保存父畫面
// 新增「返回」命令
Command backCmd = new Command("返回", Command.BACK, 1);
addCommand(backCmd);
setCommandListener(this);
}
public void commandAction(Command c, Displayable d) {
if (c.getCommandType() == Command.BACK) {
display.setCurrent(parent); // 關鍵:回到父畫面
}
}
}
// 主 MIDlet 使用方式
public void showSettings() {
display.setCurrent(new SettingsScreen(display, mainForm)); // 傳入自己作為父畫面
}
mainForm 物件未銷毀,內部輸入欄位、游標位置、捲動位置完整保留MainForm),呼叫 parent.onSettingsSaved(data) 回調| 錯誤做法 | 問題 | 正確做法 |
|---|---|---|
每次切換 new Form() | 狀態丟失、記憶體抖動 | 複用實例,或建構子傳遞必要資料 |
| 子畫面靜態引用 MIDlet | 耦合度高、難測試、記憶體洩漏風險 | 建構子注入 Display + Displayable parent |
忽略 Command.BACK 型別 | 軟鍵標籤不符合平台慣例(右軟鍵應為返回) | 返回命令使用 Command.BACK,確認用 Command.OK |
GameCanvas/Canvas 切換同理,但需注意:
hideNotify() 停止遊戲迴圈、釋放音效showNotify() 重置狀態、啟動迴圈flushGraphics() 正確呈現