在Android上实现类似于应用内导航系统的Instagram

时间:2014-04-12 22:13:50

标签: java android

我必须实现类似于Instagram Android客户端中使用的导航系统。

  1. 屏幕底部应始终有一个永久性标签栏。
  2. 当用户在其中一个标签中更深地导航时,让我们说到详细视图,然后切换到另一个标签,然后切换回上一个标签,应显示最后显示的(更深)细节视图,然后打开背压,它应该迭代回到所述标签的主视图。
  3. 到目前为止我想出的是:

    • 我有一个MainAcitvity,显示底部的菜单。
    • 在选择菜单点时,会显示appropriet Fragment。
    • 当用户在片段中进一步导航时,它会要求MainActivity按给定的标准更改其内容,从而更改显示的片段。
    • 我通过调用FragmentTransaction的addToBackStack()方法将所有Fragment更改添加到backStack。

    我现在陷入困境,无法弄清楚如何在背面按下时切换片段,以及如何在显示更深的视图而不是标签的主视图时处理标签导航。

    我正在考虑使用我自己独立的" backstack实现"对于每个标签。当用户在选项卡中更深入地导航时,我会生成一个唯一的标签"并在调用addToBackStack()时使用该标记,并将标记放在" backStack"由我实施。如果用户再次导航到此选项卡,我可以检查" backStack"中是否有任何标签。对于该选项卡,如果是,则在MainActivity的fragmentManager中的实际backStack中查找该条目,然后切换到该选项卡。

    我还没有想出更好的东西。是否有更好/更简单的方法来实现上述行为?我错过了什么吗? (我知道这在Android世界中是非常糟糕的应用程序设计,但这是另一个问题)

1 个答案:

答案 0 :(得分:5)

我发布了一个答案,因为这个问题已经死了,但结论可能对其他人有帮助。

我们最终坚持使用老式的NavgationDrawer模式,效果很好。但与此同时,我必须实现一个库项目,它为托管应用程序提供了一个Fragment,它有自己的自定义逻辑。然后,此片段使用其ChildFragmentManager在其自身内添加另一个片段。 ChildFragmentManager移植到Android Support v4 lib中,因此您可以在任何地方基本使用它。

因此,假设您需要x菜单点,您可以在其中进行更深入的导航。这些将是片段使用他们自己的ChildFragmentManagers添加其他片段以在该菜单中更深入导航。 ChildFragmentManagers有自己的后台,所以你不必担心处理状态。如果选择了另一个菜单,您可以在MainActivitys FragmentManager中查找相应的片段,然后返回到它,如果尚未添加,则添加它。

请注意,您必须自己实现后退功能,因为ChildFragmentManagers不会自动获取backPressed事件。您可以通过处理MainActivity中的onBackPressed事件来完成此操作。

@Override
public void onBackPressed() {
  boolean handled = false;
  if(getFragmentManager().getBackStackEntryCount() == 0){
    // No menu added
    return super.onBackPressed();
  }

    Fragment frag =    getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount() - 1);

  if (frag instanceof XMenuFragment && frag.isVisible()) {
    FragmentManager childFm = frag.getChildFragmentManager();
    if (childFm.getBackStackEntryCount() > 0) {
      // pop the last menu sub-Fragment
      childFm.popBackStack();
      handled = true
    }
  }

  if(!handled){
    super.onBackPressed();
  }
}

我使用了不同的代码,因此它可能包含错误,但我希望概念的重点是明确的。

相关问题