Back vs. Up - 预期行为

Back vs. Up - Intended behavior

导航设计指南解释:

When the previously viewed screen is also the hierarchical parent of the current screen, pressing the Back button has the same result as pressing an Up button—this is a common occurrence. up vs back - navigation guide

我有一个 MainActivity A,它会在触摸 NavigationDrawer 中的导航条目时打开另一个 activity B。 Activity A 在 AndroidManifest 中设置为 activity B 的父级:android:parentActivityName=".MainActivity"

我按照这个 android documentaion 将导航添加到 activity B。它显示了如何在 activity B:

中实现 onOptionsItemSelected
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
    android.R.id.home -> {
        // Respond to the action bar's Up/Home button
        NavUtils.navigateUpFromSameTask(this)
        return true
    }
}
return super.onOptionsItemSelected(item)

}

当我从 Activity B 返回时, Activity A 的状态被保存并且 NavigationDrawer 被打开。如果我使用向上导航,onCreate() of activity A 被调用并且它失去了它的状态(抽屉关闭等)。

这不是引用的"same result"。

当我用简单的 finish() 替换 NavUtils.navigateUpFromSameTask(this) 时,它的行为与按回键相同 - activity A 的状态被保留。

自然更喜欢finish的方式。那么预期的行为是什么?这些指南是否相互矛盾或遗漏了什么?

不幸的是,Google 留下文档的时间比相关的时间长,甚至 post 两个不同的文档直接相互矛盾。

对于“向上”按钮,您的 link 表示

The Up button appears in the app bar and is used to navigate within an app based on the hierarchical relationships between screens. [...]

The Back button appears in the system navigation bar and is used to navigate, in reverse chronological order, through the history of screens the user has recently worked with. It is generally based on the temporal relationships between screens, rather than the app's hierarchy.

不过,还有this article,说的是

When the system Back button would not exit your app, such as when you are on your own task and not on the start destination, the Up button should function identically to the system Back button.

那么……你应该相信哪一个?

我断言你应该相信第二个。第一个是 post 几年前编辑的;我不知道它的确切年代,但你可以看出它是旧的,因为截图都使用了 Holo 主题。另一方面,第二个是 Android 的架构组件的一部分,因此明显较新。一般来说,我会选择最新的文档。

此外,我认为 Google 错误 这么多年来,向上按钮的工作方式应该与后退按钮不同。作为一个在我的应用程序中花了很多时间思考导航的人,我知道他们来自哪里,但当 Up 做了一些“不同”的事情时,现实世界的用户总是感到困惑。

所以我会继续 finish() 你的 activity 当用户按下向上按钮时,而不用担心你找到的那两篇文章。

我认为更改政策以建议向上图标和系统后退按钮保持一致是个好主意。但是,您应该的建议是: “按时间倒序浏览屏幕历史” 太粗糙了,或者至少应该弄清楚他们所说的“屏幕”是什么意思。 例如。当你有一个底部导航栏时,后退按钮/向上图标应该让你在跳转到之前访问过的部分之前返回选项卡部分中的层次结构。并且您应该在重新访问选项卡部分时保留之前的状态(可能会向下钻取到较低级别的屏幕)。