1

我正在开发具有多个屏幕的 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 有一个按钮,允许它添加LabelFieldsVerticalFieldManager. 每当我从 A 导航到 B 时,添加的字段都不会被查看,因为它不是构造函数的一部分。因此,我想查看屏幕的最后一个或“以前”版本,而不是每次都获取新创建的屏幕。请帮忙。

4

1 回答 1

1

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

将屏幕 B 保存在内存中

在这里,当您new从 A 类中创建 B 的实例时,您会将其保存在(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());
 }

注意: 请参阅此处了解在许多类中实现此技术的更复杂的方法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
    }
}

您可以从持久存储重新加载字符串数组,并创建 new LabelFields,就像以前一样。

或者,您可以选择LabelField在用户创建内容后立即将内容保存到商店,而不是在屏幕关闭时保存。随你(由你决定。

您可能还会考虑这些标签的内容是什么,以及如果用户离开您的应用并且没有返回(在重新启动之前)会发生什么。标签的字符串丢失可以吗?

Screens此外,如果您对很多人(或者如果Screens很复杂,并且有很多孩子Fields)做同样的事情,第一个替代方案可能会占用大量内存。如果你只有这个问题MsgScreen,那么它可能不是一个大问题,最简单的解决方案是我建议的第一个。但是,如果您的应用中有很多屏幕(A、B、C、D、E、F 等),那么当它们实际上并没有显示时,您可能不想全部保存它们。

这类问题应该可以帮助您确定何时或是否应该保存 UI 的状态。

于 2013-03-29T02:42:12.260 回答