ActionBar'up'按钮销毁父活动,'back'不会

时间:2014-03-04 20:57:48

标签: android android-actionbar android-actionbar-compat

我有一个相对简单的Android应用,其中一个Activity显示项目列表,另一个显示所选项目的详细信息。我启动了list活动,这是我最重要的活动(使用FLAG_ACTIVITY_CLEAR_TOP来清除调用它的登录活动):

Intent intent = new Intent(this, ListInstancesActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

并且从该活动中我对选择的项目采取行动:

Intent detailIntent = new Intent(this, ShowInstanceActivity.class);
detailIntent.putExtra(ShowInstanceFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);

一切正常,如果我使用软键“后退”按钮,我会按照我的预期返回ListInstancesActivity。但是,如果我按下操作栏上的后退/上移按钮,它会销毁并重新创建ListInstancesActivity。这很糟糕,因为这样做的成本相对较高。

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

应该注意的是,我正在使用操作栏的支持库版本。

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>

4 个答案:

答案 0 :(得分:96)

在android manifest.xml中为我工作的父活动标签添加以下属性。

android:launchMode="singleTop"

参考:http://developer.android.com/guide/topics/manifest/activity-element.html

参考类似的问题: How can I return to a parent activity correctly?

答案 1 :(得分:31)

您可以覆盖操作栏按钮应该执行的操作:

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

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

return super.onOptionsItemSelected(item);
}

然后重新创建后退按钮效果。

答案 2 :(得分:3)

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

检查这个我已经回答了这个问题

https://stackoverflow.com/a/32401235/3479012

你需要通过onOptionsItemSelected中的android.R.id.home访问它来覆盖操作栏中的nevigation按钮,并完成顶级活动。

答案 3 :(得分:1)

您的清单中的父活动似乎未正确设置。在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>