返回上一版本的屏幕

时间:2013-03-28 09:09:38

标签: blackberry navigation screen

我正在开发具有多个屏幕的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时,添加的字段都不会被查看,因为它不是构造函数的一部分。因此,我想查看屏幕的最后一个或“上一个”版本,而不是每次都获得一个新创建的屏幕。请帮忙。

1 个答案:

答案 0 :(得分:1)

我认为你在这里有两个不同的选择(至少):

将屏幕B保留在内存中

这里,当你从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类中,使用可重复使用的基类

存储B的状态并在(重新)显示时加载

另一种选择是让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的状态。