【问题标题】:The proper way to handle "Up" Navigation according to guidelines根据指南处理“向上”导航的正确方法
【发布时间】:2012-12-26 12:31:33
【问题描述】:

我完全同意下面的导航

假设 Book 详细信息是在 BookDetailActivity 的不同实例中创建的。

book2详细信息中按下之前的堆栈是:

  • BookDetailActivity(第 2 册 - 你在这里)
  • BookDetailActivity(书 1)
  • AllBooksActivity

如果我关注guidelines,我将使用:

     Intent parentActivityIntent = new Intent(this, AllBooksActivity.class);
        parentActivityIntent.addFlags(
                Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(parentActivityIntent);
        finish();

但是这段代码最大的问题是BookDetailActivity(Book 1)还活着!

在“up”后按返回键将显示第 1 册的详细信息。

我怎样才能杀死原始AllBooksActivity和我按下的活动之间的所有BookDetailActivity

【问题讨论】:

  • 你考虑过用片段代替活动吗?
  • 我需要一个不同的 Activity,因为我希望动画(如果在用户设备上启用)创建一个新的“窗口”并在整个屏幕之间进行转换
  • 据我所知,您可以在片段之间进行转换:developer.android.com/reference/android/app/…, int, int, int)
  • 是的,但不是在整个“窗口”之间。我需要使用不同的活动,是的。
  • 抱歉,在您使用 FLAG_ACTIVITY_CLEAR_TOP 启动 AllBooksActivity 后,BookDetailActivity(Book 1)如何仍然存在。它应该消失了。实际上,当您启动该 Intent 时,您的所有活动都应该完成,并且应该创建一个新的 AllBooksActivity 实例(除非该活动具有 launchMode="singleTop"

标签: android android-intent navigation back-stack


【解决方案1】:

related guidelines article 注释如下:

实施说明:作为最佳实践,在实施 Home 或向上,确保清除所有后代屏幕的后堆栈。 对于 Home,后堆栈上唯一剩余的屏幕应该是 主屏幕。对于向上导航,应移除当前屏幕 来自后台堆栈,除非 Back 跨屏幕层次结构导航。 您可以使用 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_NEW_TASK 意图标志一起实现这一目标。

既然你这样做了,BookDetailActivity1 应该由FLAG_ACTIVITY_CLEAR_TOP 关闭。如果它可以活着并在按下 Back 时显示,唯一的方法是它会在 AllBooksActivity 之前启动。

至于不需要FLAG_ACTIVITY_NEW_TASKandroid开发者的回答建议):

当使用这个标志时,如果一个任务已经在为这个活动运行 您现在正在开始,则不会开始新的活动; 相反,当前任务将简单地被带到前面 屏幕上的状态。

...所以如果您的活动存在,它不会启动新任务。

【讨论】:

  • 就新任务标志而言,您的评论可能是真的,但为什么要首先添加标志?对我来说,这似乎不是一项新任务。
  • 并非在所有情况下都需要它。但是,如果用户可以从应用程序外部(通过通知、扫描代码等)启动 BookDetailsActivity,那就有意义了。请参阅本文中的最后一个示例(在应用程序之间导航以支持共享):developer.android.com/design/patterns/navigation.html
【解决方案2】:

好的,有多种方法可以做到这一点。这是其中之一:

但是,我建议不要像打开新活动一样打开第一个活动,只需完成当前活动和之前的活动即可。

为此,请使用 startActivityForResult 调用每个新活动,并将每个活动的结果设置为表示您希望返回第一个活动的某个值。

您甚至可以将值设置为类规范名称,并创建一个将自动处理所有这些请求的基本活动,这样您就不需要处理它了。

无论如何,我认为您使用 Intent.FLAG_ACTIVITY_NEW_TASK 是一个错误,因为它创建了一个新任务,所以前一个任务仍然存在。尝试阅读可用的意图标志以获取更多信息: http://developer.android.com/reference/android/content/Intent.html

【讨论】:

  • 听起来好像开发者博客不准确:developer.android.com/training/implementing-navigation/…
  • 好吧,如果谷歌在他们的帖子中更开放,我可以在那里评论他们有一个错误:)。我敢肯定这不是唯一的错误。
  • 不管怎样,你可以查看 google 和 actionBarSherlock 的示例,看看它应该如何工作。
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 2020-08-06
  • 2011-05-22
  • 2011-11-30
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多