Android ActionBar';向上';按钮销毁父活动&x27;背面';不

Android ActionBar';向上';按钮销毁父活动&x27;背面';不,android,android-actionbar,android-actionbar-compat,Android,Android Actionbar,Android Actionbar Compat,我有一个相对简单的Android应用程序,其中一个活动显示项目列表,另一个显示所选项目的详细信息。我启动列表活动,这是我最重要的活动(使用FLAG\u activity\u CLEAR\u TOP清除调用它的登录活动): 在该活动中,我通过以下方式对所选项目进行操作: Intent detailIntent = new Intent(this, ShowInstanceActivity.class); detailIntent.putExtra(ShowInstanceFragment.ARG_

我有一个相对简单的Android应用程序,其中一个
活动
显示项目列表,另一个显示所选项目的详细信息。我启动列表活动,这是我最重要的活动(使用
FLAG\u activity\u CLEAR\u TOP
清除调用它的登录活动):

在该活动中,我通过以下方式对所选项目进行操作:

Intent detailIntent = new Intent(this, ShowInstanceActivity.class);
detailIntent.putExtra(ShowInstanceFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
一切正常,如果我使用软键“后退”按钮,那么我会像预期的那样返回到
列表InstanceActivity
。但是,如果我按下操作栏上的“后退/向上”按钮,则它将销毁并重新创建
ListInstanceActivity
。这是不好的,因为这样做的计算成本相对较高

如何使操作栏的行为与软键相同,并返回到上一个活动,而不是销毁它

应该注意的是,我使用的是actionbar的支持库版本

my
AndroidManifest.xml
的相关部分如下

<activity
  android:name=".agenda.ListInstancesActivity"
  android:label="@string/list_instances_activity_title">
</activity>
<activity
  android:name=".agenda.ShowInstanceActivity"
  android:label="@string/show_instance_activity_title"
  android:parentActivityName=".agenda.ListInstancesActivity">
</activity>

您可以覆盖actionbar up按钮的功能:

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case android.R.id.home:
    onBackPressed();
    return true;
}

return super.onOptionsItemSelected(item);
}

并重新创建后退按钮效果

您的清单中似乎没有正确设置父活动。将此添加到ShowInstanceActivity活动标记中:

<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".agenda.ListInstancesActivity" />

因此,您的最终活动标签应该如下所示:

<activity
  android:name=".agenda.ShowInstanceActivity"
  android:label="@string/show_instance_activity_title"
  android:parentActivityName=".agenda.ListInstancesActivity">
  <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".agenda.ListInstancesActivity" />
</activity>

在android manifest.xml中为父活动标记添加以下属性对我来说很有效

android:launchMode="singleTop"
参考:

请参阅类似问题:

当您在清单中指定父活动时,当您单击操作栏中的“向上导航”按钮时,它将重新启动

我已经回答了这个问题


您需要通过OnOptions ItemSelected中的android.R.id.home访问actionbar中的up按钮并完成top活动来覆盖它。

感谢您的建议,但是这对我不起作用,actionbar up按钮仍然会破坏父活动。请在父活动-android:launchMode=“singleTop”中添加清单... 这对我起了作用……享受:)这看起来很管用;通过此更改,软后退按钮和actionbar向上按钮现在遵循相同的代码路径。下面的@vikki_日志给出了更好的答案。后退按钮和向上按钮有不同的行为,它们不应该做相同的事情。如果我导航到详细信息活动
ShowInstanceActivity
,那么回击应该会将我带回我的应用程序或以前所在的位置。使用“向上”按钮可以使我在应用程序方面向后导航。操作栏向上问题的完美答案…:)。谢谢,谢谢。这个答案对我的情况有帮助,因为我不希望创建父视图。我希望以与“后退”按钮相同的方式取消子视图。这非常有效!。有人知道为什么这是android上的默认行为吗?这真的毫无意义。如果你想在用户要求时销毁某个活动,为什么要将其保留在内存中呢?D:我开始悬赏@feresr的这条评论。我很好奇为什么会有这种行为。我可以发誓这不是几年前旧api级别的行为。另一个值得一读的好参考来理解这个问题:Android开发人员提供Up导航:Up应该在应用程序内部导航。完成当前活动并不能保证您将留在当前应用程序中。好吧,它不必每次都退出您的应用程序。这取决于您为“android.R.id.home”的每个活动编写的代码。CLEAR_TOP与列表活动之前的登录活动无关。它声明列表活动之后的所有内容都应该完成。考虑有登录,列表,详细,列表,细节开始。使用CLEAR_TOP标志启动列表活动后,堆栈将如下所示:LOGIN,LIST。列表活动将从头开始重新创建。如果您另外指定SINGLE_TOP,则列表活动将被保留并接收onNewIntent(Intent)回调。的可能重复
android:launchMode="singleTop"