根据我从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没有显示任何内容。
答案 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,并附上代码。