【发布时间】:2015-02-06 15:08:08
【问题描述】:
我正在克隆一个使用UITabBarViewController 作为“main/outer/root”UIViewController 的 iOS 应用程序。它的每个选项卡都有一个UINavigationController 作为根来管理UIViewController 实例的导航堆栈。
我正在努力做两件事:
- 复制 iOS 应用的功能。
- 以真正的“Android”方式执行此操作(即,在非 iOS 世界中不强制采用 iOS 范例)。
我搜索了很多,但这个话题在过去几年中似乎发生了很大变化。我尝试了一个解决方案,它只有一个 Activity 来管理所有内容,但这需要维护单独的后台堆栈,并且似乎受到了大多数用户的反对。
目前,我有一个“有点”工作的解决方案。据我了解,我目前的设置是:
- 扩展
ActionBarActivity的单个BaseActivity类。 - 我的应用程序中的所有活动(目前只有 2 个,但计划为 5 个)扩展了这个类。
- 这个基础活动加载一个
drawer.xml布局,它有一个android:support.v4.widget.DrawerLayout作为其最外层的项。 - 里面是:
-
FrameLayout,这是我的片段的容器。 -
ListView,即抽屉本身。
-
根据我对应用程序的测试,此设置可以满足我的大部分需求。
- 当我“导航”(使用抽屉)到另一个活动时,会加载正确的活动。
- 当我“导航”到“更深”的片段(通过屏幕控件)时,会推送正确的新片段,并且我已经在
BaseActivity中覆盖了onBackPressed(),以便在适当的情况下正确弹出返回堆栈。
我遇到的问题是这样的:
- 应用程序启动并显示“Activity 1:Fragment 1”。我单击一个项目以移动到“Activity 1:Fragment 2”(效果很好)。
- 我使用抽屉启动 Activity 2,并显示“Activity 2:Fragment 1”。到目前为止,一切都很好。
- 我使用抽屉返回(至少这是我的意图)到现有的 Activity 1,并显示“Activity 1:Fragment 1”。
我查看了 Activity/Intent 启动标志,但我不确定我是否真的了解发生了什么。到目前为止,我的阅读使我尝试了以下步骤:
- 切换 Activity 时,将其标志设置如下:
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - 在我的 AndroidManifest.xml 中,像这样设置 Activity launchMode:
android:launchMode="singleInstance",或者像这样android:launchMode="singleTop"
我面临的一个奇怪的额外问题是,启动一个新的 Activity 似乎并没有像我预期的那样创建 Activity 回栈。当我从 Activity 1 移动到 Activity 2 时(暂时忽略缺少片段返回堆栈维护),从 Activity 2 按下后退按钮会关闭应用程序,这让我感到困惑。
对于这种类型的应用程序结构/导航,是否存在单一的当前最佳做法?
【问题讨论】:
-
“我用抽屉回去”——这是什么意思?导航抽屉中的项目应该去一个特定的地方(例如,“联系人”),而不是一个合乎逻辑的地方(例如,“回到你以前的地方”)。 “这种类型的应用程序结构/导航是否有一个单一的、当前的最佳实践?” -- 请记住,这里只有一小部分人会知道您的 iOS 结构/导航是什么,因为这里并不是每个人都是 iOS 开发人员。
-
@CommonsWare “返回”如“返回”而不是“返回”如“向上导航堆栈”。另外,我觉得我很好地解释了结构。它是一组同级选项卡,每个选项卡都维护自己的导航堆栈,返回该选项卡时应保持该导航堆栈。
-
“它是一组兄弟标签,每个标签都维护自己的导航堆栈”——标签通常不像你在 Android 中描述的那样使用。
-
你能推荐一个替代范式吗?我正在移植一个 iOS 应用程序。它有 5 个不同的部分,每个部分都有导航堆栈。在 Android 中表示这一点的恰当成语是什么?我查看了 Facebook 应用程序,他们在屏幕顶部有一个基于图标的栏,您可以点击或滑动。但是,如果我阅读了一个故事(因此,在“新闻提要”“标签”中更深入地导航 1 级),我必须返回到“根”屏幕才能切换到我的通知。这对我来说似乎对用户不友好,但这是在 Android 上完成的方式吗?
-
您将这些选项卡转换为导航抽屉条目的方法似乎非常合理,除了“每个都有导航堆栈”的概念。这不是 Web 浏览器之外的 Android 中的典型模式。
标签: android android-intent android-fragments