Mortar的ActionBar所有者

时间:2014-10-30 17:44:00

标签: mortar

在迫击炮中,我很好奇人们如何根据所显示的屏幕改变ActionBar。比如说,如果要显示某个屏幕,您想要更改ActionBar标题。

注入一个活动似乎是一个糟糕的想法,你想要一个演示者(或者我认为是视图)能够在屏幕旋转后获得正确的操作栏。

这里是否有一种特别有效的模式我错过了?我工作的所有解决方案,但比我希望的更尴尬。

1 个答案:

答案 0 :(得分:1)

对于操作,flow-sample应用程序的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();
  ...

两种方法都知道要显示的屏幕。这些操作在onCreateOptionsMenu()中定义,go()中的标题。问题是所有这些都位于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线性扩展,并且不惜一切代价直接在其中引用屏幕类。

希望这有帮助!