如何导航到同一个父状态

sar*_*unw 36 android android-intent android-actionbar

根据我从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);
Run Code Online (Sandbox Code Playgroud)

}

在我的情况下,我有3个活动,比如AB和C,当用户从A导航到BI时添加一些额外内容和onCreateBI使用额外的东西从数据库查询数据以填充我的行,当我从C导航回来时,所有额外内容都消失了B什么都没显示.

yon*_*joy 92

android活动的"标准"行为是,每次有此活动的新意图时,都会创建活动的新实例(请参阅此处的 launchMode-docu ).因此,如果你调用navigateUpTo,你的额外内容似乎已经消失了.

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

android:launchMode="singleTop"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 澄清一下:为"父"活动添加singleTop launchMode属性(向上导航到的那个). (6认同)
  • 谷歌没有在文档中解决这个问题真的很令人沮丧:有很多关于默认上行导航行为的StackOverflow问题.感谢您发布此内容!(另外,在搜索SO时,我发现[一个有用的演示文稿](https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android)处理一些更复杂的案例.) (5认同)

yon*_*joy 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);
Run Code Online (Sandbox Code Playgroud)

  • 真正奇怪的是,根据`navigateUpTo(Activity sourceActivity,Intent upIntent)`的文档,`从sourceActivity导航到upIntent指定的活动,完成流程中的sourceActivity.upIntent将具有此方法设置的标志FLAG_ACTIVITY_CLEAR_TOP,以及Android设计指南中概述的正确导航所需的任何其他标志. (2认同)