【问题标题】:Implementing Instagram like in-app navigation system on Android在 Android 上实现类似 Instagram 的应用内导航系统
【发布时间】:2014-04-12 22:13:50
【问题描述】:

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

  1. 屏幕底部应该有一个永久的标签栏。
  2. 当用户在其中一个选项卡中进行更深入的导航时,可以说是详细视图,然后切换到另一个选项卡,然后切换回上一个选项卡,最后显示的(更深的)详细视图应该会显示,然后打开后按,它应该迭代回到所述选项卡的主视图。

到目前为止,我想出了以下几点:

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

我被困在这一点上,无法弄清楚如何在后按时切换片段,以及当显示更深的视图而不是选项卡的主视图时如何处理选项卡导航。

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

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

【问题讨论】:

  • 朋友,我也遇到了同样的情况,如果你最终知道如何进行这种导航,我非常感谢你发布它并告诉我,谢谢
  • @Hugo 我已经发布了我的经验作为答案。如果您觉得有帮助,请告诉我。

标签: java android


【解决方案1】:

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

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

因此,假设您需要 x 个菜单点,您可以在其中进行更深入的导航。这些将是使用自己的 ChildFragmentManager 的片段来添加其他片段以在该菜单中更深入地导航。 ChildFragmentManager 有自己的后台堆栈,因此您不必担心处理状态。如果选择了另一个Menu,可以在MainActivitys FragmentManager中查找对应的Fragment,改回,如果还没有添加就添加。

请注意,您必须自己实现返回功能,因为 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();
  }
}

我使用了不同的代码,所以它可能包含错误,但我希望概念的重点是清楚的。

【讨论】:

  • 太棒了@Csaba Szugyiczki,这是一个有趣的解决问题的方法,我会在接下来的几天里尝试一下,我会告诉你我的结果,非常感谢!
  • 现在我正处于实现的中间,但目前带有片段的解决方案运行良好@Csaba Szugyiczki 与您的解决方案不同,但我猜它相似。完成后我会用一些代码发布解决方案好吗? (可能下周)
  • @Hugo 太棒了!感谢您的反馈。快乐编码!期待听到您的经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多