我正在开发具有多个屏幕的BlackBerry应用程序。我可以轻松地从每个屏幕来回导航。但是,我试图“返回”导航到之前版本的屏幕。例如,有两个屏幕A(主屏幕)和B(第二屏幕)。我按如下方式从A导航到B:
UiApplication.getUiApplication().pushScreen(new MsgScreen());
我从B导航回A:
public boolean onClose() {
UiApplication.getUiApplication().popScreen(this);
return true;
}
每当我从A导航到B时,都会创建一个新的B实例。但是,屏幕B有一个按钮,可以将LabelFields
添加到VerticalFieldManager
。每当我从A导航到B时,添加的字段都不会被查看,因为它不是构造函数的一部分。因此,我想查看屏幕的最后一个或“上一个”版本,而不是每次都获得一个新创建的屏幕。请帮忙。
答案 0 :(得分:1)
我认为你在这里有两个不同的选择(至少):
这里,当你从A类中创建一个B的new
实例时,你将它保存在一个成员变量(A类)中。然后,只要你需要从A返回B,你将使用成员变量,如果有的话:
A类:
private MsgScreen _bScreen;
private MsgScreen getBScreen() {
// don't actually create the screen until we need it,
// but don't create more than one instance
if (_bScreen == null) {
_bScreen = new MsgScreen();
}
return _bScreen;
}
public void showB() {
UiApplication.getUiApplication().pushScreen(getBScreen());
}
注意: see here for a more sophisticated way to implement this technique在许多Screen
类中,使用可重复使用的基类。
另一种选择是让MsgScreen
(B)被破坏,并且每次都像你原来那样重新创建。但是,请确保在MsgScreen
关闭时使用类似PersistentStore
的内容来保存其状态,而不是原始设计。换句话说,如果用户可以在B屏幕上添加标签,则保存所有标签的内容。也许您将String[]
(或Vector
)保存到PersistentStore
。然后,在MsgScreen
的构造函数中,或者在(MsgScreen.java
):
protected void onUiEngineAttached(boolean attached) {
if (attached) {
// load the String[] from the persistent store,
// and create new LabelFields
} else {
// save the String[] to the persistent store
}
}
你可以从持久性商店重新加载字符串数组,并创建新的LabelFields
,就像你以前一样。
或者,您可以选择在用户创建商店后立即将LabelField
内容保存到商店,而不是在屏幕关闭时保存。这取决于你。
您可能还会考虑这些标签的内容是什么,以及如果用户离开您的应用程序会发生什么,并且不会返回(在重新启动之前)。标签的字符串丢失了吗?
此外,第一个替代方案可能会占用大量内存,如果你对许多Screens
做同样的事情(或者如果Screens
很复杂,并且有很多孩子{{1} }})。如果您只有Fields
的这个问题,那么它可能不是一个大问题,最简单的解决方案将是我建议的第一个。但是,如果您的应用程序中有许多屏幕(A,B,C,D,E,F等),那么当它们实际上没有显示时,您可能不想全部保存它们。
这些问题应该可以帮助您确定何时或是否应该保存UI的状态。