3

在 Mortar 中,我很好奇人们如何处理 ActionBar,如果它根据显示的屏幕发生变化。例如,如果某个屏幕正在显示,您想更改 ActionBar 标题或操作。

注入 Activity 似乎是一个糟糕的主意,并且您希望演示者(或视图,我想)能够在屏幕旋转后获得正确的操作栏。

这里有我遗漏的特别有效的模式吗?我的所有解决方案都有效,但比我希望的要尴尬。

4

1 回答 1

1

对于操作,流示例应用程序的 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 在您实现新屏幕时线性扩展,并避免不惜一切代价直接在其中引用您的屏幕类。

希望这可以帮助!

于 2015-05-04T09:30:05.737 回答