带有许多片段的 Android 导航抽屉

Posted

技术标签:

【中文标题】带有许多片段的 Android 导航抽屉【英文标题】:Android Navigation Drawer with many fragments 【发布时间】:2014-04-05 12:16:41 【问题描述】:

我已经为此苦苦挣扎了一段时间,我想从我的问题的图表开始:

三个导航抽屉按钮是我的基本活动的一部分。三个按钮下方的每个紫色块都是碎片,每个块的后代依次是碎片。我将使用主片段和详细片段来演示我遇到的问题...用户单击导航抽屉按钮,这将打开包含文章列表的主片段。一旦用户点击其中一篇文章,我就会在主片段中打开详细片段。所以如果我发现自己在细节,我决定打开导航抽屉并点击第三个按钮,然后再次点击第二个按钮,我希望细节仍然打开,如果我点击手机的后退按钮希望它移回主片段,并在那里结束。任何提示都会有所帮助,因为我可能会对第一个按钮使用类似的模式,它是主要片段,也是子片段。

【问题讨论】:

【参考方案1】:

在我看来,处理您所描述的最简洁的方法是拥有三个单独的 FragmentActivity 类来实现 DrawerLayout 而不是一个单一的 BaseActivity

抽屉中的每个按钮都应该使用launchMode singleTask 启动它各自的FragmentActivity。这可以确保您每次启动相同的活动实例,而不是一个新的实例,当您使用抽屉按钮在它们之间切换时,它将为每个活动维护您的后台堆栈。详情请见android Developer Guide Activity:launchMode。

三个FragmentActivity 实例中的每一个都应负责使用侦听器接口启动和管理其片段。例如,如果您让 Master 片段直接打开 Detail 片段,您应该让 Master 片段告诉它是 FragmentActivity 它需要打开 Detail 片段。有关在FragmentActivityFragment 之间实施这种类型的解耦通信的推荐做法,请参阅Android Developer Guide: Communicating with Other Fragments。当您需要不同的平板电脑布局等时,它会让您的生活更轻松。

三个主要抽屉“任务”中的每一个似乎都足够独特,以至于将每一个隔离在它自己的FragmentActivity 似乎是实现您正在尝试做的事情的最佳方式。您可以对每个主要部分应用相同的方法。

【讨论】:

【参考方案2】:

我遇到了同样的问题,不想进行多个活动,因为这会使我的应用程序的后退导航变得复杂。除非正在调用活动生命周期事件,否则您的片段不会自动保存其状态。

在我们的例子中,这些不会发生,因为我们没有离开活动。您可以在要替换的 Fragment 上使用 FragmentManager 的 saveFragmentState 来手动触发状态保存并获取 Fragment.SavedState 对象。您可以保留 SavedState 对象的列表,并在推送片段时检查您是否有保存状态。如果是这样,您可以调用 Fragment setInitialSavedState 这将导致您的片段加载以前的状态。

现在在我的应用中,当用户在带有自己的子片段的片段之间切换时,状态会在它们返回时保留。

【讨论】:

单一活动实施的可靠方法。

以上是关于带有许多片段的 Android 导航抽屉的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套片段的导航抽屉 (ViewPager)

带有导航抽屉的 Android 应用程序的正确结构

Android - 如何更改导航抽屉中的片段

如何在主片段中单击按钮时打开导航抽屉?

在 Android 中创建带有导航抽屉的汉堡菜单

Android导航组件“向上按钮”打开抽屉导航