Android:带导航堆栈的选项卡式应用程序

时间:2015-02-06 15:08:08

标签: android android-intent android-fragments

我正在努力克隆使用UITabBarViewController作为“主要/外部/根”UIViewController的iOS应用。每个选项卡都有一个UINavigationController作为根管理UIViewController个实例的导航堆栈。

我正在努力做两件事:

  1. 复制iOS应用的功能。
  2. 以真正的“Android”方式进行(即,在非iOS世界中不强制推行iOS范例)。
  3. 我搜索了一下,但过去几年这个话题似乎发生了很大变化。我尝试了一个只有一个Activity来管理所有内容的解决方案,但这需要维护单独的后台堆栈,并且似乎从这里的大多数用户那里得到了大拇指。

    目前,我有一个“有点”工作的解决方案。据我了解,我目前的设置是:

    • 扩展BaseActivity的单个ActionBarActivity类。
    • 我的应用程序中的所有活动(到目前为止只有2个,但定为5个)扩展了这个类。
    • 此基本活动会加载drawer.xml布局,其最外层项目为android:support.v4.widget.DrawerLayout
    • 其中包括:
      • A FrameLayout,这是我片段的容器。
      • A ListView,这是抽屉本身。

    根据我对该应用的测试,此设置可以让我获得我想要的大部分内容。

    • 当我“导航”(使用抽屉)到不同的活动时,会加载正确的活动。
    • 当我“导航”到“更深层”的片段(通过屏幕控制)时,会推送正确的新片段并覆盖onBackPressed()中的BaseActivity以正确弹出后台堆栈如果合适的话。

    我遇到的问题是:

    1. 启动应用程序并显示“活动1:片段1”。我点击一个项目移动到“活动1:片段2”(效果很好)。
    2. 我使用抽屉启动活动2,并显示“活动2:片段1”。到目前为止,这么好。
    3. 我使用抽屉将返回(至少是我的意图)到现有的活动1,并显示“活动1:片段1”。
    4. 我查看了Activity / Intent启动标志,但我不确定我是否真的得到了正在发生的事情。到目前为止,我的阅读使我尝试了以下步骤:

      1. 切换Activites时,设置其标志如下: intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
      2. 在我的AndroidManifest.xml中,设置Activity launchMode,如下所示: android:launchMode="singleInstance",或者像这样 android:launchMode="singleTop"
      3. 我面临的另一个奇怪的问题是,启动一个新的Activity似乎并没有像我期望的那样创建Activity返回堆栈。当我从活动1移动到活动2(暂时忽略片段后端堆栈维护)时,按下活动2中的后退按钮会关闭应用程序,这会让我感到困惑。

        此类应用结构/导航是否有单一,当前最佳做法?

1 个答案:

答案 0 :(得分:0)

好的方法是拥有1个活动并手动处理后台堆栈,因为Android只有1个堆栈。我已经多次这样做了,最后我创建了一个名为Tab Stacker的库来完成这项工作:每个标签的片段历史记录。

它是开源的并且完整记录,并且可以使用gradle轻松包含。您可以在github上找到该库:https://github.com/smart-fun/TabStacker

您还可以下载示例应用以查看该行为符合您的需求:

https://play.google.com/apps/testing/fr.arnaudguyon.tabstackerapp

如果您有任何疑问,请随时发邮件。