在黑莓,我可以从一个屏幕转到下一屏幕,但我不能导航回到先前的画面。 按在模拟器中ESC键终止整个应用程序。 有没有在模拟器中任意键转到上一个屏幕或任何代码导航回? 如果你知道,请帮助我。
Answer 1:
正如安德烈说,有一个显示栈,所以如果你把屏幕弹出没有他们,他们将留在堆栈,因此关闭当前屏幕,先前的屏幕将显示automattically,如果没有上一个。 屏幕,应用程序将关闭。
然而这不是很好的显示栈持有多个屏幕,这样你就可以实现屏幕的内部样的叠加,手动处理导航。
对于屏幕堆栈实现摘要屏幕类:
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;
}
}
Answer 2:
黑莓保持画面的堆栈; 显示器叠层 。
屏幕被弹出到堆栈,并通过主管他们的UIApplication的弹出栈。 跳跳的最后一个屏幕从堆栈关闭默认的应用程序 。
如果你正在运行一个UIApplication的,名为MyUiApplication,您可以通过调用pushScreen添加屏幕堆栈(新SomeScreen());
屏幕方面,如果从MainScreen衍生,因为大多数黑莓手机屏幕是,与DEFAULT_CLOSE标志创建的,这意味着在BlackBerry退出按钮自然会关闭屏幕 ,造成popScreen()被调用。 你可以,当然,之后的任何按键或滚轮/轨迹球点击呼叫popScreen()。 该屏幕还可以调用close()本身上,其具有相同的结果; 屏幕被弹出栈,该应用程序在返回到先前的屏幕,或终止应用程序,如果最后一个屏幕被弹出显示堆栈。
如果应用程序不作为的UIApplication创建,或者如果屏幕最初推到从非UI线程显示堆栈(如后台线程),则必须确保调用关闭屏幕也做从UI线程 。 这可以通过确保eventLock正在执行任何UI操作(人们通常称之为invokeLater的为好,在这种情况下)之前采取的Application类来完成。
如果原来的屏幕被弹出到堆栈作为一个全球性的画面(无模式,在所有其他屏幕顶部),那么它必须被弹出使用类似的堆栈:
。Ui.getUiEngine()DismissStatus(本);
在任何情况下,覆盖的OnClose()和close()所导出的屏幕将允许您陷阱用于调试和进一步分析所出现的异常。