ActionBar“向上”button破坏父级活动,“返回”不会

我有一个相对简单的Android应用程序,一个Activity显示项目列表,另一个显示选定项目的详细信息。 我开始列表活动,这是我最重要的活动(使用FLAG_ACTIVITY_CLEAR_TOP来清除从中调用它的login活动):

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

并从该活动内我采取行动select一个项目:

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

所有的工作正常,如果我使用软键“返回”button,然后我回到我所期望的ListInstancesActivity 。 但是,如果我按下操作栏上的上/下button,则会销毁并重新创buildListInstancesActivity 。 这很糟糕,因为这样做在计算上相对昂贵。

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

应该指出,我正在使用操作栏的支持库版本。

我的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> 

您可以覆盖操作栏向上button应该执行的操作:

 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; } return super.onOptionsItemSelected(item); } 

并重新创build后退button效果。

在android manifest.xml中为父活动标记添加以下属性对我有用。

 android:launchMode="singleTop" 

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

请参阅类似的问题: 我如何正确返回父活动?

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

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

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

你需要通过访问onOptionsItemSelected中的android.R.id.home来覆盖actionbar中的nevigationbutton,并完成顶级的活动。

看起来您的父级活动在您的清单中没有正确设置。 在你的ShowInstanceActivity活动标签中join这个:

 <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>