我有一个相对简单的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>
答案 0 :(得分:96)
在android manifest.xml中为我工作的父活动标签添加以下属性。
android:launchMode="singleTop"
参考:http://developer.android.com/guide/topics/manifest/activity-element.html
答案 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>