36

从我对 Gmail 和 TED 应用程序的观察来看,向上导航的行为将导航到具有相同状态(滚动位置)的父级,这与谷歌在他们的文档实施向上导航中所说的不同,就像创建父级意图并启动它一样。

我从 Android 示例代码中实现了代码,所有状态都消失了(我之前设置的所有额外参数和滚动位置)。什么是正确的方法?我在 Android 文档上找不到任何内容。

下面是代码:

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        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);
        }
        return true;
}
return super.onOptionsItemSelected(item);

}

在我的情况下,我有 3 个活动说 AB 和 C,当用户从 A 导航到 BI 时放置了一些额外内容,onCreate而 BI 使用这些额外内容从数据库查询数据以填充我的行,当我从 C 导航回来时,所有额外内容都消失了,活动B 什么都不显示。

4

5 回答 5

92

android 活动的“标准”行为是,每次该活动有新的意图时,都会创建一个新的活动实例(请参阅此处的 launchMode-docu )。因此,如果您调用 navigateUpTo,您的附加功能似乎消失了。

在你的情况下,我建议使用

android:launchMode="singleTop"

用于您的 AndroidManifest.xml 中的父活动。这样,您将返回到您现有的活动(只要它位于任务的后堆栈的顶部)。这样,您的额外内容将被保留。

我也不明白为什么你引用的谷歌文档中没有提到这一点,因为这似乎是人们在使用向上导航时所期望的行为。

于 2013-06-27T11:38:20.577 回答
12

这是已接受答案的替代解决方案:

如果您无法更改launchMode活动的 或如果父活动不在后堆栈顶部(例如 A 是 C 的父级),则不能使用上述解决方案。在这种情况下,您必须扩展您的navigateUpTo调用以告诉活动,如果它在后台堆栈上,则不应重新创建它:

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);
于 2013-12-06T10:14:37.137 回答
1

当我在带有片段的主要活动中调用 startActivityForResult() 然后尝试使用向上导航从被调用者返回到它时,我遇到了类似的问题。通过实施向上导航解决:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            setResult(RESULT_CANCELED);
            finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

在这种情况下,向上按钮的行为类似于普通的后退按钮,并且所有状态都被保留。

于 2013-09-11T22:13:18.867 回答
1

你可以使用这个:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            super.onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
于 2015-05-23T16:25:00.010 回答
0

您需要将状态保存在父活动上,并在从调用活动返回后恢复。

请参阅使用 Save Instance State 保存 Android Activity 状态以获取有关该过程的完整说明,并附有代码。

于 2012-11-08T17:07:22.460 回答