我已经为此苦苦挣扎了一段时间,我想从我的问题图表开始:
三个导航抽屉按钮是我的基本活动的一部分。三个按钮下方的每个紫色块都是碎片,每个块的后代依次是碎片。我将使用主片段和详细片段来演示我遇到的问题...用户单击导航抽屉按钮,这将打开包含文章列表的主片段。一旦用户点击其中一篇文章,我就会在主片段中打开详细片段。所以如果我发现自己在细节,我决定打开导航抽屉并点击第三个按钮,然后再次点击第二个按钮,我希望细节仍然打开,如果我点击手机的后退按钮希望它移回主片段,并在那里结束。任何提示都会有所帮助,
我已经为此苦苦挣扎了一段时间,我想从我的问题图表开始:
三个导航抽屉按钮是我的基本活动的一部分。三个按钮下方的每个紫色块都是碎片,每个块的后代依次是碎片。我将使用主片段和详细片段来演示我遇到的问题...用户单击导航抽屉按钮,这将打开包含文章列表的主片段。一旦用户点击其中一篇文章,我就会在主片段中打开详细片段。所以如果我发现自己在细节,我决定打开导航抽屉并点击第三个按钮,然后再次点击第二个按钮,我希望细节仍然打开,如果我点击手机的后退按钮希望它移回主片段,并在那里结束。任何提示都会有所帮助,
在我看来,处理您所描述的最简洁的方法是拥有三个单独FragmentActivity
的类来实现DrawerLayout
而不是一个 monolithic BaseActivity
。
抽屉中的每个按钮都应该FragmentActivity
使用launchMode
singleTask
. 这确保您每次启动相同的活动实例,而不是一个新的实例,当您使用抽屉按钮在它们之间切换时,它将为每个活动维护您的后台堆栈。有关更多详细信息,请参阅Android 开发人员指南 Activity:launchMode。
这三个FragmentActivity
实例中的每一个都应负责使用侦听器接口启动和管理其片段。例如,如果您让 Master 片段直接打开 Detail 片段,您应该让 Master 片段告诉它是 FragmentActivity 它需要打开 Detail 片段。请参阅Android 开发人员指南:与其他 FragmentFragmentActivity
通信,了解在和之间实现这种类型的解耦通信的推荐做法Fragment
。当您想要平板电脑的不同布局等时,它将使您的生活更加轻松。
三个主要抽屉“任务”中的每一个似乎都足够独特,以至于将每个任务隔离在自己的范围内FragmentActivity
似乎是实现您正在尝试做的事情的最佳方式。您可以对每个主要部分应用相同的方法。
我遇到了同样的问题,不想进行多个活动,因为这会使我的应用程序的后退导航变得复杂。除非正在调用活动生命周期事件,否则您的片段不会自动保存其状态。
在我们的情况下,这些不会发生,因为我们没有离开活动。您可以在要替换的 Fragment 上使用 FragmentManager 的saveFragmentState来手动触发状态保存并获取 Fragment.SavedState 对象。您可以保留 SavedState 对象的列表,并在推送片段时检查您是否有保存状态。如果是这样,您可以调用 Fragment setInitialSavedState这将导致您的片段加载以前的状态。
现在在我的应用程序中,当用户在带有自己的子片段的片段之间切换时,状态会在它们返回时保留。