在 Mortar 中,我很好奇人们如何处理 ActionBar,如果它根据显示的屏幕发生变化。例如,如果某个屏幕正在显示,您想更改 ActionBar 标题或操作。
注入 Activity 似乎是一个糟糕的主意,并且您希望演示者(或视图,我想)能够在屏幕旋转后获得正确的操作栏。
这里有我遗漏的特别有效的模式吗?我的所有解决方案都有效,但比我希望的要尴尬。
在 Mortar 中,我很好奇人们如何处理 ActionBar,如果它根据显示的屏幕发生变化。例如,如果某个屏幕正在显示,您想更改 ActionBar 标题或操作。
注入 Activity 似乎是一个糟糕的主意,并且您希望演示者(或视图,我想)能够在屏幕旋转后获得正确的操作栏。
这里有我遗漏的特别有效的模式吗?我的所有解决方案都有效,但比我希望的要尴尬。
对于操作,流示例应用程序的 MainActivity 包括:
public boolean onCreateOptionsMenu(Menu menu) {
...
Object screen = AppFlow.get(this).getBackstack().current().getScreen();
...
public void go(Backstack nextBackstack, Flow.Direction direction, Flow.Callback callback)
Screen screen = (Screen) nextBackstack.current().getScreen();
...
两种方法都知道要显示的屏幕。动作在 go() 中的标题 onCreateOptionsMenu() 中定义。问题是所有这些都位于 MainActivity 中。
您可以做的是使用以下方法创建一个ActionEnabledScreen接口:
public boolean onCreateOptionsMenu(Menu menu);
以及带有方法的TitleEnabledScreen接口:
public void getTitle();
您的活动将如下所示:
public boolean onCreateOptionsMenu(Menu menu) {
...
Object screen = AppFlow.get(this).getBackstack().current().getScreen();
if (screen instanceof ActionEnabledScreen) {
return ((ActionEnabledScreen)screen).onCreateOptionsMenu(menu);
}
...
public void go(Backstack nextBackstack, Flow.Direction direction, Flow.Callback callback)
Screen screen = (Screen) nextBackstack.current().getScreen();
if (screen instanceof TitleEnabledScreen) {
setTitle(((TitleEnabledScreen)screen).getTitle());
}
...
请注意,我没有运行上面的代码,所以它可能无法编译/运行,但我希望你能看到这个想法。目的是避免 MainActivity 在您实现新屏幕时线性扩展,并避免不惜一切代价直接在其中引用您的屏幕类。
希望这可以帮助!