在Blackberry中,我可以从一个屏幕导航到下一个屏幕,但我无法导航回上一个屏幕。按模拟器中的转义键可终止整个应用程序。模拟器中是否有任何其他键可以转到上一个屏幕或任何导航回来的代码?如果你知道请帮助我。
答案 0 :(得分:16)
正如安德烈所说,有一个显示堆栈,所以如果您按下屏幕而不弹出它们,它们将保持堆叠状态,因此关闭当前屏幕,前一个屏幕将自动显示,如果没有上一个。屏幕,应用程序将关闭。
然而,在显示堆栈中保留许多屏幕并不好,因此您可以在屏幕内部实现堆栈类型,以手动处理导航。
屏幕堆栈实现的抽象屏幕类:
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());
}
}
}
第二个屏幕示例:
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;
}
}
答案 1 :(得分:13)
BlackBerry维护着一叠屏幕; 显示堆栈。
屏幕弹出到堆栈中,并通过负责它们的 UiApplication 弹出堆栈。 默认情况下,将最后一个屏幕弹出堆栈会关闭应用程序。
如果您正在运行名为MyUiApplication的UiApplication,您可以通过调用 pushScreen(new SomeScreen())来将屏幕添加到堆栈中;
如果从大多数黑莓手机屏幕派生出来的屏幕都是使用 DEFAULT_CLOSE 标志创建的,这意味着BlackBerry上的 ESCAPE按钮会自然关闭屏幕,导致调用popScreen()。当然,您可以在任何按键或拨轮/轨迹球点击后调用popScreen()。屏幕也可以自己调用close(),结果相同;屏幕弹出堆栈,将应用程序返回到上一个屏幕,或者如果最后一个屏幕弹出显示器堆栈,则终止应用程序。
如果应用程序未创建为UiApplication,或者屏幕最初是从非UI线程(例如后台线程)推送到显示堆栈,那么必须确保调用关闭屏幕也是从UI线程完成的。这可以通过确保在执行任何UI操作之前在应用程序类上执行 eventLock 来完成(通常会将 invokeLater 称为 invokeLater 好吧,在这种情况下)。
如果原始屏幕作为全局屏幕(无模式,在所有其他屏幕之上)弹出到堆栈中,则必须使用以下内容将其从堆栈中弹出:
<强> Ui.getUiEngine()dismissStatus(本); 强>
在任何情况下,覆盖派生的屏幕的 onClose()和 close()将允许您捕获发生的异常以进行调试进一步分析。