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

8
我需要实现一个类似于Instagram Android客户端的导航系统。
以下是要求:
1. 应该始终在屏幕底部保留一个永久选项卡。 2. 当用户在其中一个选项卡中向更深层次导航,比如到达详细视图,然后切换到另一个选项卡,再返回到先前的选项卡时,应显示最后显示的(更深层次的)详细视图,并且在返回按钮按下时,应迭代回到所述选项卡的主视图。
我已经想出了以下解决方案:
1. 我有一个MainActivity,在底部显示菜单。 2. 选择菜单项后,将显示相应的Fragment。 3. 当用户在Fragment中进一步导航时,它会要求MainActivity根据给定的条件更改其内容,从而更改所显示的Fragment。 4. 通过调用FragmentTransaction的addToBackStack()方法,我将所有Fragment更改添加到后退堆栈中。
但是,我目前卡在这一点上,无法弄清如何在返回按钮按下时切换片段,以及如何处理当显示深层次视图而不是选项卡的主视图时的选项卡导航。
我的想法是为每个选项卡使用自己独立的“后退堆栈实现”。当用户在选项卡中导航更深时,我会生成一个唯一的“标签”,并在调用addToBackStack()时使用该标签,并将标签放入我实现的“后退堆栈”中。如果用户再次导航到此选项卡,则可以检查该选项卡的“后退堆栈”中是否有任何标签,如果有,则可以在MainActivity的fragmentManager中查找真正的后退堆栈中的条目,并切换到它。
我还没有想出更好的方法。是否有更好/更简单的方法来实现所需的行为?我错过了什么吗?(我知道这是Android世界中非常糟糕的应用程序设计,但这是另一个问题。)

我和你一样处于同样的情况,如果你最终知道如何进行这种导航,我会非常感激你发布并告诉我,请谢谢。 - Hugo
@Hugo,我已经把我的经验作为答案发布了。如果你觉得有帮助,请告诉我。 - Csaba Szugyiczki
1个回答

5

由于问题已经很久没有回复,但结论可能对其他人有帮助,因此我会发布一个答案。

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

假设您想要x个菜单点,您可以在其中进行更深入的导航。这些将是使用自己的ChildFragmentManagers的片段,以添加其他片段以在该菜单中更深入地导航。ChildFragmentManagers有自己的后退堆栈,因此您不必太担心处理状态。如果选择另一个菜单,您可以在MainActivity的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();
  }
}

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

很棒的@Csaba Szugyiczki,这是解决问题的有趣方式,我会在接下来的几天尝试一下,并告诉您我的结果,非常感谢! - Hugo
现在我正在实现过程中,但目前使用片段的解决方案完美地运行。@Csaba Szugyiczki的解决方案与你的不同,但我想它是相似的。完成后,我会发布一些代码的解决方案,好吗?(可能是下周) - Hugo
@Hugo 太棒了!感谢您的反馈。愉快编码!期待听到您的经验。 - Csaba Szugyiczki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接