5

在黑莓中,我可以从一个屏幕导航到下一个屏幕,但无法导航回上一个屏幕。在模拟器中按下退出键会终止整个应用程序。模拟器中是否有任何其他键可以转到上一个屏幕或任何代码可以返回?如果你知道请帮助我。

4

2 回答 2

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;
    }
}
于 2009-07-15T09:01:19.383 回答
13

黑莓维护着一堆屏幕;显示堆栈

屏幕弹出到堆栈上,并通过负责它们的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(this);

在任何情况下,重写派生Screen的onClose()close()将允许您捕获发生的异常以进行调试和进一步分析。

于 2009-07-14T12:03:16.777 回答