В Blackberry я могу переходить с одного экрана на следующий, но не могу вернуться к предыдущему экрану. Нажатие клавиши выхода в эмуляторе завершает работу всего приложения. Есть ли в эмуляторе еще одна клавиша для перехода к предыдущему экрану или какой-либо код для возврата? Если вы знаете, пожалуйста, помогите мне.
Как вернуться к предыдущему экрану в 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());
}
}
}
Пример второго экрана:
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. При удалении последнего экрана из стека приложение закрывается по умолчанию.
Если вы используете приложение UiApplication с именем MyUiApplication, вы можете добавить экран в стек, вызвав pushScreen (new SomeScreen ());
Экран, если он является производным от MainScreen, как и большинство экранов BlackBerry, создается с флагом DEFAULT_CLOSE, что означает, что кнопка ESCAPE на BlackBerry естественным образом закрывает экран, вызывая popScreen (), который будет вызван. Вы, конечно, можете вызвать popScreen () после любого нажатия клавиши или щелчка колесика / трекбола. Экран также может вызывать close () для себя, что дает тот же результат; экран выталкивается из стека, возвращая приложение к предыдущему экрану или завершая работу приложения, если последний экран выталкивается из стека отображения.
Если приложение не создано как UiApplication, или если экран изначально был помещен в стек отображения из потока, не относящегося к пользовательскому интерфейсу (например, из фонового потока), то необходимо убедиться, что вызов закрытия экрана также < strong> сделано из потока пользовательского интерфейса. Это можно сделать, убедившись, что eventLock используется в классе Application перед выполнением любой операции пользовательского интерфейса (обычно можно вызвать invokeLater как ну и в этой ситуации).
Если исходный экран был помещен в стек как глобальный экран (немодальный, поверх всех других экранов), его необходимо извлечь из стека, используя что-то вроде:
Ui.getUiEngine (). dismissStatus (this);
В любом случае переопределение onClose () и close () производного экрана позволит вам перехватить возникшее исключение для отладки и дальнейшего анализа. .