Blackberry では、ある画面から次の画面に移動できますが、前の画面に戻ることはできません。エミュレータでエスケープ キーを押すと、アプリケーション全体が終了します。エミュレーターに前の画面に移動するための他のキーや、戻るためのコードはありますか? ご存知でしたらお助けください。
2 に答える
アンドレイが言ったように、表示スタックがあるので、画面をポップせずに押すと、画面はスタックのままになります。したがって、現在の画面を閉じると、前の画面が自動的に表示され、前の画面がない場合は表示されます。画面、アプリケーションが閉じます。
ただし、多くの画面をディスプレイスタックに保持するのは適切ではないため、画面内に一種のスタックを実装して、ナビゲーションを手動で処理できます。
画面スタック実装用の抽象画面クラス:
public abstract class AScreen extends MainScreen {
Screen prevScreen = null;
void openScreen(AScreen nextScreen) {
nextScreen.prevScreen = this;
UiApplication.getUiApplication().popScreen(this);
UiApplication.getUiApplication().pushScreen(nextScreen);
}
void openPrevScreen() {
UiApplication.getUiApplication().popScreen(this);
if (null != prevScreen)
UiApplication.getUiApplication().pushScreen(prevScreen);
}
}
最初の画面の例:
public class FirstScreen extends AScreen implements FieldChangeListener {
ButtonField mButton = null;
public FirstScreen() {
super();
mButton = new ButtonField("Go second screen", ButtonField.CONSUME_CLICK);
mButton.setChangeListener(this);
add(mButton);
}
public void fieldChanged(Field field, int context) {
if (mButton == field) {
openScreen(new SecondScreen());
}
}
}
2番目の画面の例:
public class SecondScreen extends AScreen implements FieldChangeListener {
ButtonField mButton = null;
public SecondScreen() {
super();
mButton = new ButtonField("Go first screen", ButtonField.CONSUME_CLICK);
mButton.setChangeListener(this);
add(mButton);
}
public void fieldChanged(Field field, int context) {
if (mButton == field) {
openPrevScreen();
}
}
public boolean onClose() {
openPrevScreen();
return true;
}
}
BlackBerry は画面のスタックを維持します。ディスプレイスタック。
画面はスタックにポップされ、それらを担当するUiApplicationを介してスタックからポップされます。スタックから最後の画面をポップすると、デフォルトでアプリケーションが閉じます。
MyUiApplication という名前の UiApplication を実行している場合は、pushScreen(new SomeScreen())を呼び出して画面をスタックに追加できます。
MainScreen から派生した場合、ほとんどの BlackBerry 画面と同様に、画面はDEFAULT_CLOSEフラグで作成されます。これは、BlackBerry の ESCAPE ボタンが画面を自然に閉じ、 popScreen() が呼び出されることを意味します。もちろん、キーを押したりトラックホイール/トラックボールをクリックした後に popScreen() を呼び出すこともできます。画面自体で close() を呼び出すこともできますが、これは同じ結果になります。画面がスタックからポップされ、アプリケーションが前の画面に戻るか、最後の画面がディスプレイ スタックからポップされた場合はアプリケーションが終了します。
アプリケーションが UiApplication として作成されていない場合、または画面が最初に非 UI スレッド (バックグラウンド スレッドなど) からディスプレイ スタックにプッシュされた場合は、画面を閉じる呼び出しも行われていることを確認する必要があります。 UI スレッドから。これは、UI 操作を実行する前にApplicationクラスでeventLockが取得されていることを確認することで実行できます (この状況では、通常はinvokeLaterも呼び出します)。
元の画面がグローバル画面 (モードレス、他のすべての画面の上) としてスタックにポップされた場合、次のような方法でスタックからポップする必要があります。
Ui.getUiEngine().dismissStatus(これ);
いずれにせよ、派生したScreenのonClose()とclose()をオーバーライドすると、発生した例外をトラップして、デバッグとさらなる分析を行うことができます。