我认为您在这里有几个不同的选择(至少):
将屏幕 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 很复杂,并且有许多子 Fields),则第一个替代方案可能会占用大量内存。如果你只对MsgScreen 有这个问题,那么这可能不是什么大问题,最简单的解决方案就是我建议的第一个。但是,如果您的应用中有很多屏幕(A、B、C、D、E、F 等),那么您可能不想全部保存,因为它们实际上并没有显示出来。
这类问题应该可以帮助您确定何时或是否应该保存 UI 的状态。