我的应用程序设计如下。 这是一个旅行索赔报销应用程序。它有两个标签:
它在左侧有多个声明,当选中时在右侧显示条目。
我做了以下观点。
AppView
:适用于包含标签面板和标签MyAccountsView
:用于MyAccount标签下的内容。MyClaims View
:用于Myclaims标签下的内容。这有两个面板。左边的那个加载了索赔。在选择要求查看权利之前,权利为空。SelectedClaimView
:右侧的面板,显示所选索赔的分类广告。每个视图都有相应的位置和活动。
以下要求在创建应用程序时遇到困难:
当我点击左侧面板上的声明时,右侧面板必须在selectedClaimView中显示声明条目。当我单击另一个声明时,必须使用该声明的内容填充列表。我还希望对此索赔选择提供历史支持。
我在设计时遇到以下问题:
如何添加嵌套活动。例如当我选择MyClaimsTab时,所有声明都必须在左侧面板中加载。在选择索赔时,索赔条目必须通过选定的索赔视图在右侧面板中加载。但是,调用活动并更改地点会停止调用活动。
此外,两个选项卡中的两个活动必须同时运行,并且必须在选项卡开关之间维护历史记录。这是我不知道该怎么做的事情,并希望得到建议。
答案 0 :(得分:1)
您的要求非常简单,因此您的设计应该如此。您只需要两个活动和两个视图:AccountView和ClaimsView。
您需要一个简单的小部件 - 一个带有两个标签样式选项卡的FlowPanel - 作为导航菜单。您将此小部件放在两个视图的顶部,并将ClickHandler附加到与另一个视图对应的标签 - 即在AccountView中将处理程序附加到Claims标签,该标签触发presenter.goTo(新的ClaimsTab(“”)。声明标签应该在ClaimsView中设置一个按下的标签,在AccountView中设置帐户标签。它负责导航:不需要特殊的活动。
AccountView很简单:导航小部件位于顶部,详情如下。对于ClaimsView,使用LayoutPanel分为三个层:导航窗口小部件的顶层,索引的左层和详细信息的右层。假设您使用Tree作为声明,并在ScrollPanel中包含一个FlowPanel(“claimDetailsPanel”)以获取声明详细信息。
您的ClaimsView应该有一个“初始化”标志(带有getter和setter)。当用户访问ClaimsTab时,您将启动您的ClaimsActivity。此活动获取对ClaimsView的引用。它检查是否初始化了ClaimsView。如果没有,它会加载声明列表并填充声明树。构建树时,将每个声明设置为每个TreeItem的用户对象。然后将initialized标志设置为true。
您将选择处理程序附加到调用presenter.goTo的树(new ClaimsTab(selectedClaim.getId()。toString()));
这会将用户返回到同一个标签,但是使用新的网址标记 - 如果选择的声明ID = 123,您将看到#ClaimsTab:123标记。屏幕上不会闪烁,因为ClaimsView已经构建并且仍然可见。
现在您将有一个新的ClaimsActivity正在运行。此活动注意到(a)存在需要处理的令牌,以及(b)由于视图已初始化,因此无需加载声明并填充声明树。您的活动应解析令牌(将其转换为声明ID),加载此声明的详细信息,并将此信息提供给ClaimsView以填充claimDetailsPanel(您应首先清除它,因为它可能包含上一个声明的内容)。
一个小细节。用户可以为任何声明加书签。因此,如果您的ClaimsActivity构建声明树,则应检查令牌。带书签的页面将具有令牌,因此活动应该告诉视图选择哪个树项目。
这是它:两个视图,两个活动。什么都没有嵌套。
答案 1 :(得分:0)
Slotted框架可让您轻松完成此操作。 (免责声明:我写了Slotted)。让我描述一种简单的方法来做你想要的。您可以像这样定义主AppPlace:
public class AppPlace extends SlottedPlace {
public static final Slot TabsSlot = new Slot(new AppPlace(), new MyClaimsPlace());
@Override public Slot getParentSlot() {
return SlottedController.RootSlot;
}
@Override public Slot[] getChildSlots() {
return new Slot[] {TabsSlot};
}
}
这告诉Slotted框架你的AppPlace有一个Slot,它可以在当前视图中包含另一个Activity。
在AppActivity中,您需要扩展SlottedPlace并覆盖此方法:
@Override public void setChildSlotDisplay(Slot slot) {
slot.setDisplay(tabsSlotWidget);
}
tabsSlotWidget将是一个SimplePanel或SimpleLayoutPanel,将用作新活动的容器。 AppPlace中可以有两个插槽,你也可以在MyClaimsPlace中有插槽。 SlottedTab小部件提供与TabPanel类似的功能,但允许每个选项卡都是一个Activity。
除了上述变化之外,活动的工作方式与GWT A& P相同。您还可以在Slotted内运行现有的A& P站点,并仅升级需要嵌套的活动。
这允许多个活动同时启动,正常GWT A& P不允许。如果你调用一个Place,它在Activity中处于同一级别,它将只替换该Activity并仍保持层次结构的其余部分。
Slotted将处理整个层次结构的历史记录,因此无论嵌套的级别/广度有多少,历史记录都可以重新创建它。
答案 2 :(得分:-1)
我希望我能指出你正确的方向。
有无数种实现逻辑的方法。我建议阅读命令设计模式(谷歌你会找到很好的资源)
如果您的意思是浏览器历史记录,请参阅DevGuide。 如果你的意思只是记住用户选择的选项。然后简单编写自己的类来记住它,这也可以帮助你1 ..