带有许多片段的 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 片段。有关在FragmentActivity
和Fragment
之间实施这种类型的解耦通信的推荐做法,请参阅Android Developer Guide: Communicating with Other Fragments。当您需要不同的平板电脑布局等时,它会让您的生活更轻松。
三个主要抽屉“任务”中的每一个似乎都足够独特,以至于将每一个隔离在它自己的FragmentActivity
似乎是实现您正在尝试做的事情的最佳方式。您可以对每个主要部分应用相同的方法。
【讨论】:
【参考方案2】:我遇到了同样的问题,不想进行多个活动,因为这会使我的应用程序的后退导航变得复杂。除非正在调用活动生命周期事件,否则您的片段不会自动保存其状态。
在我们的例子中,这些不会发生,因为我们没有离开活动。您可以在要替换的 Fragment 上使用 FragmentManager 的 saveFragmentState 来手动触发状态保存并获取 Fragment.SavedState 对象。您可以保留 SavedState 对象的列表,并在推送片段时检查您是否有保存状态。如果是这样,您可以调用 Fragment setInitialSavedState 这将导致您的片段加载以前的状态。
现在在我的应用中,当用户在带有自己的子片段的片段之间切换时,状态会在它们返回时保留。
【讨论】:
单一活动实施的可靠方法。以上是关于带有许多片段的 Android 导航抽屉的主要内容,如果未能解决你的问题,请参考以下文章