gpt4 book ai didi

android - JellyBean 上的向上导航坏了?

转载 作者:IT老高 更新时间:2023-10-28 21:48:17 26 4
gpt4 key购买 nike

源代码在这里:https://github.com/novemberox/NavigationTest此示例的修改版本:http://developer.android.com/training/implementing-navigation/ancestral.html

我有三个 Activity :

  • Main Activity 只是应用程序的主要入口
  • Category Activity 是 Detail Activity 的父级
  • 详细 Activity

Main Activity 具有打开 Category ActivityDetail Activity 的按钮。Category Activity 只有一个按钮可以打开Detail Activity。最后是 Detail Activity,它显示一些文本并具有向上按钮,模拟点击 ActionBar 向上。

我的“点击”路径是:

  • 打开主要 Activity
  • 打开详细 Activity
  • 点击“向上按钮”
  • 应显示类别 Activity
  • 返回点击将我们移动到状态已恢复的主 Activity

这是预期的流程,它在 Jelly Bean 之前的每个 Android 上运行良好(在 Galaxy Nexus 4.1.1 和模拟器 4.2 Google exp 包上测试)。它甚至适用于 ICS。我正在使用支持库和类,如 NavUtils 和 TaskStackBuilder,就像我在开始时指出的示例一样。

在 JB 上,当我单击“向上按钮”时,它会返回到 Main Activity,状态已正确恢复。我查看了支持库的源代码,发现 NavUtils.navigateUpTo 方法调用了原生 JB 代码,例如 Activity#navigateUpTo。我尝试了 NavUtils#navigateUpTo()NavUtils.navigateUpFromSameTask() ,结果同样不满意。

你有什么建议要怎么做才能有这么好的流程吗?

最佳答案

首先,如果您的目标设备高达 API 17 (Android 4.2),请在 list 中将 targetSdkVersion 设置为 17。这不会破坏对旧设备的支持,它只会让新设备正常工作。当然,这并不能解决您的问题——这样做很好。

你应该使用什么?

我假设您的代码基于 this page 上的祖先导航示例.您已经使用了第二个示例:

Intent upIntent = new Intent(this, MyParentActivity.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is not part of the application's task, so create a new task
// with a synthesized back stack.
TaskStackBuilder.from(this)
.addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
.addNextIntent(new Intent(this, MyGrandParentActivity.class))
.addNextIntent(upIntent)
.startActivities();
finish();
} else {
// This activity is part of the application's task, so simply
// navigate up to the hierarchical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}

但是,对于您想要的行为,您需要将 NavUtils.navigateUpTo 替换为:

upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(upIntent);
finish();

为什么它适用于 ICS 及更早版本?

一般来说,支持库试图近似在以后的 API 中引入的行为。在 NavUtils 的情况下,支持库试图近似 API 16(又名 Android 4.1)中引入的行为。对于 API 16 之前的平台,NavUtils用途:

@Override
public void navigateUpTo(Activity activity, Intent upIntent) {
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(upIntent);
activity.finish();
}

这会在返回堆栈中查找 upInent 中指定的 Activity 实例。如果它找到一个,它会清除它的所有内容并恢复它。否则它只会启动 Activity 。

在 API 16+ 更高版本的平台上,支持库将事情交给 Activity API 中的 native 调用。根据文档:

public boolean navigateUpTo (Intent upIntent)

Navigate from this activity to the activity specified by upIntent, finishing this activity in the process. If the activity indicated by upIntent already exists in the task's history, this activity and all others before the indicated activity in the history stack will be finished.

If the indicated activity does not appear in the history stack, this will finish each activity in this task until the root activity of the task is reached, resulting in an "in-app home" behavior. This can be useful in apps with a complex navigation hierarchy when an activity may be reached by a path not passing through a canonical parent activity.

因此,如果 upIntent 中指定的 Activity 不在后栈中,它是否会启动它还不清楚。阅读 the source code也无助于澄清事情。但是,从您的应用显示的行为来看,它似乎没有尝试启动 upIntent Activity 。

无论哪种实现是对还是错,最终结果都是您想要 FLAG_ACTIVITY_CLEAR_TOP 行为,而不是原生 API 16 行为。不幸的是,这意味着您将不得不复制支持库的近似值。

哪个是正确的?

免责声明:我不为 Google 工作,所以这是我的最佳猜测。

我的猜测是 API 16+ 的行为是预期的行为;它是一个内置的实现,可以访问 Android 内部,并且可以做一些通过 API 不可能完成的事情。在 API 16 之前,我认为除了使用 Intent 标志之外,不可能以这种方式展开回栈。因此,FLAG_ACTIVITY_CLEAR_TOP 标志是 API 16 之前的平台可用的 API 16 行为的最接近

不幸的是,结果是在 native 实现和支持库实现之间存在违反 principle of least astonishment 的情况。在你的场景中。这让我怀疑这是否是对 API 的意外使用。即,我想知道 Android 是否希望您遍历 Activity 的完整导航路径,而不是直接跳转到它。

以防万一

为了避免一种可能的误解,有人可能希望 shouldUpRecreateTask 神奇地确定父级不在后台堆栈中,并使用TaskStackBuilder.

但是,shouldUpRecreateTask 基本上确定您的 Activity 是由您的应用直接启动(在这种情况下它返回 false),还是从另一个应用启动(在在这种情况下它返回 true)。来自 this book ,支持库会检查 Intent 的“ Action ”是否不是 ACTION_MAIN(我不完全理解),而在 API 16 平台上,它会根据任务关联性执行此检查。尽管如此,在这个应用程序的情况下,shouldUpRecreateTask 返回 false。

关于android - JellyBean 上的向上导航坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com