Как вернуться к предыдущему экрану в Blackberry? - PullRequest
5 голосов
/ 14 июля 2009

В Blackberry я могу перейти от одного экрана к следующему, но не могу вернуться к предыдущему экрану. Нажатие клавиши escape в эмуляторе завершает все приложение. Есть ли какая-либо другая клавиша в эмуляторе для перехода на предыдущий экран или какой-либо код для перехода назад? Если вы знаете, пожалуйста, помогите мне.

Ответы [ 2 ]

16 голосов
/ 15 июля 2009

Как сказал Андрей, есть стек отображения, поэтому, если вы нажимаете на экраны, не нажимая на них, они останутся в стеке, поэтому при закрытии текущего экрана предыдущий экран будет отображаться автоматически, а при отсутствии пред. экран, приложение закроется.

Однако нехорошо держать много экранов в стеке отображения, поэтому вы можете реализовать вид стека внутри экранов, чтобы обрабатывать навигацию вручную.

Абстрактный класс экрана для реализации стека экрана:

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;
    }
}
13 голосов
/ 14 июля 2009

BlackBerry поддерживает стек экранов; стек отображения .

Экраны выталкиваются в стек и выталкиваются из стека через приложение UiApplication , отвечающее за них. Удаление последнего экрана из стека закрывает приложение по умолчанию .

Если вы запускаете приложение UiApplication с именем MyUiApplication, вы можете добавить экран в стек, вызвав pushScreen (new SomeScreen ()) ;

Экран, если он получен из MainScreen, как и большинство экранов BlackBerry, создается с флагом DEFAULT_CLOSE , означающим, что кнопка ESCAPE на BlackBerry естественным образом закроет экран , вызывая popScreen () для вызова. Конечно, вы можете вызвать popScreen () после любого нажатия клавиши или трекбола / трекбола. Экран также может вызывать close () для себя, что приводит к тому же результату; экран выталкивается из стека, возвращая приложение к предыдущему экрану, или завершает работу приложения, если последний экран выталкивается из стека дисплея.

Если приложение не создано как приложение UiApplication или экран изначально был помещен в стек отображения из потока, не являющегося пользовательским интерфейсом (например, фонового потока), то необходимо убедиться, что вызов закрывает экран также сделано из потока пользовательского интерфейса . Это можно сделать, убедившись, что eventLock берется в классе Application перед выполнением какой-либо операции пользовательского интерфейса (обычно также вызывается invokeLater в это ситуация).

Если исходный экран был вставлен в стек как глобальный экран (немодальный, поверх всех других экранов), то он должен быть удален из стека с помощью чего-то вроде:

Ui.getUiEngine () dismissStatus (это);.

В любом случае переопределение onClose () и close () производного Screen позволит вам перехватить возникающее исключение для отладки и дальнейшего анализа .

...