繁体   English   中英

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

[英]Android: Tabbed App with Navigation Stacks

我正在克隆一个使用UITabBarViewController作为“ main / outer / root” UIViewController的iOS应用。 每个选项卡都有一个UINavigationController作为根,以管理UIViewController实例的导航堆栈。

我正在努力做两件事:

  1. 复制iOS应用程序的功能。
  2. 以真正的“ Android”方式进行操作(即在非iOS世界中不强制使用iOS范例)。

我已经搜索了很多,但是在过去几年中,这个主题似乎已经发生了很大变化。 我尝试了一个解决方案,该解决方案具有一个可管理所有活动的活动,但该活动需要维护单独的后备堆栈,并且似乎对这里的大多数用户都不满意。

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

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

根据我对应用程序的测试,此设置可为我提供大部分所需信息。

  • 当我“导航”(使用抽屉)到另一个活动时,将加载正确的活动。
  • 当我“导航”到“更深”片段(通过屏幕上的控件),正确的新片段推,我已经覆盖onBackPressed()BaseActivity如果合适的话,以正确弹出返回堆叠。

我遇到的问题是这样的:

  1. 启动该应用程序,并显示“活动1:片段1”。 我单击一个项目以移动到“活动1:片段2”(效果很好)。
  2. 我使用抽屉启动活动2,并显示“活动2:片段1”。 到现在为止还挺好。
  3. 我使用抽屉返回 (至少是我的意图)回到现有的活动1,并显示“活动1:片段1”。

我已经研究了“活动/意图”启动标志,但是不确定我是否真的知道发生了什么。 到目前为止,我的阅读使我尝试了以下步骤:

  1. 切换intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); ,请按以下方式设置其标志: intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  2. 在我的AndroidManifest.xml中,将Activity launchMode设置如下: android:launchMode="singleInstance"或这样
    android:launchMode="singleTop"

我面临的一个奇怪的附加问题是,启动新的Activity似乎并没有像我期望的那样创建Activity back堆栈。 当我从活动1移到活动2(暂时忽略缺少碎片返回堆栈维护)时,在活动2中按返回按钮将关闭应用程序,这使我感到困惑。

对于这种类型的应用程序结构/导航,是否存在单一的当前最佳实践?

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

它是开源的并且有完整的文档,可以很容易地随gradle一起提供。 您可以在github上找到该库: https : //github.com/smart-fun/TabStacker

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM