【问题标题】:ActionBar 'up' button destroys parent activity, 'back' does notActionBar“向上”按钮会破坏父活动,“返回”不会
【发布时间】:2014-03-04 20:57:48
【问题描述】:

我有一个相对简单的 Android 应用程序,其中一个 Activity 显示项目列表,另一个显示所选项目的详细信息。我启动列表活动,这是我最顶层的活动(使用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。这很糟糕,因为这样做的计算成本相对较高。

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

需要注意的是,我使用的是actionbar的支持库版本。

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

【问题讨论】:

  • CLEAR_TOP 与列表活动之前的登录活动无关。它指出列表活动之后的所有内容都应该完成。考虑启动 LOGIN、LIST、DETAIL、LIST、DETAIL。使用 CLEAR_TOP 标志启动 LIST 活动后,堆栈将如下所示:LOGIN,LIST。 LIST 活动将从头开始重新创建。如果您另外指定 SINGLE_TOP,则 LIST 活动将被保留并接收 onNewIntent(Intent) 回调。

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


【解决方案1】:

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

【讨论】:

  • Action bar Up 问题的完美答案... :) 。谢谢
  • 谢谢。这个答案在我的情况下对我有帮助,因为我不希望创建父视图。我希望以与后退按钮相同的方式关闭子视图。
  • 这很好用!有谁知道为什么这是android上的默认行为,这真的没有意义。如果您要在用户请求时销毁它,为什么还要在内存中保留一个活动 D:
  • 我为@feresr 的这条评论开始了赏金活动。我很好奇为什么这是这种行为。我可以发誓这不是几年前在旧 api 级别中的行为。
  • 另一个值得阅读以了解问题的好参考:Android 开发人员提供向上导航:developer.android.com/training/implementing-navigation/…
【解决方案2】:

您可以覆盖操作栏向上按钮的功能:

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

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

return super.onOptionsItemSelected(item);
}

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

【讨论】:

  • 这看起来可以解决问题;通过此更改,软后退按钮和操作栏向上按钮现在遵循相同的代码路径。
  • 下面的@vikki_logs 给出了更好的答案。后退按钮和“向上”具有不同的行为,它们不应该做同样的事情。如果我导航到详细活动 ShowInstanceActivity 然后回击应该带我回到 my 应用程序或我以前所在的位置。使用“向上”按钮应该可以在 您的 应用程序方面向后导航。
【解决方案3】:

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

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

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

您需要通过 onOptionsItemSelected 中的 android.R.id.home 访问它来覆盖操作栏中的向上导航按钮并完成顶部活动。

【讨论】:

  • Up 应该在您的应用程序内部导航。完成当前活动并不能保证您将留在当前应用程序中。
  • 好吧,它不需要每次都退出你的应用程序。这取决于您为“android.R.id.home”的每个活动编写的代码。
【解决方案4】:

您的清单中似乎未正确设置您的父活动。将此添加到您的 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:launchMode="singleTop"...这对我有用..享受:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多