【问题标题】:How to navigate back to the previous screen in Blackberry?如何导航回黑莓中的上一个屏幕?
【发布时间】:2009-07-14 04:23:24
【问题描述】:

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

【问题讨论】:

  • 你在问什么模拟器/软件?

标签: user-interface blackberry navigation screen


【解决方案1】:

正如安德烈所说,有一个显示堆栈,所以如果你推送屏幕而不弹出它们,它们会留在堆栈中,所以关闭当前屏幕,会自动显示上一个屏幕,如果没有上一个屏幕。屏幕,应用程序将关闭。

但是,在显示堆栈中保存许多屏幕并不好,因此您可以在屏幕内部实现一种堆栈,以手动处理导航。

屏幕栈实现的抽象屏幕类:

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;
    }
}

【讨论】:

    【解决方案2】:

    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(this);

    在任何情况下,覆盖派生的 ScreenonClose()close() 将允许您捕获发生的异常以进行调试并进一步分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      相关资源
      最近更新 更多