如何导航到同一个父状态

时间:2012-11-08 16:53:33

标签: android android-intent android-actionbar

根据我从Gmail和TED应用程序观察到的向上导航的行为,它将导航到具有相同状态(滚动位置)的父级,而不像谷歌在他们的文档Implement Up Navigation中所说的那样创建父意图并开始它。

我实现了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没有显示任何内容。

5 个答案:

答案 0 :(得分:91)

Android活动的“标准”行为是,每次有此活动的新意图时,都会创建活动的新实例(请参阅launchMode-docu here)。因此,如果你调用navigateUpTo,你的额外内容似乎就消失了。

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

android:launchMode="singleTop"

用于AndroidManifest.xml中的父活动。这样您将返回到现有活动(只要它位于任务的后堆栈顶部)。这样你的演员就会被保留。

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

答案 1 :(得分:12)

这是accepted answer的替代解决方案:

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

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

答案 2 :(得分: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);
}

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

答案 3 :(得分:1)

你可以用这个:

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

答案 4 :(得分:0)

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

有关预处理的完整说明,请参阅Saving Android Activity state using Save Instance State,并附上代码。