【问题标题】:Android Actionbar Up button versus system Back buttonAndroid Actionbar 向上按钮与系统返回按钮
【发布时间】:2012-04-25 16:48:21
【问题描述】:

我正在使用操作栏,它是“向上”按钮,可以从详细活动返回到主要活动,效果很好。同样,用户也可以按系统的“返回”按钮返回到主Activity。

在我的主要活动中,onCreate() 中的数据是从互联网下载的,以便在应用启动时显示。我注意到,当我使用操作栏“向上”按钮从详细信息转到主要活动时,onCreate() 正在运行,重新下载数据。但是onCreate()在我使用系统“返回”按钮时没有运行,因此立即显示主活动视图。

我在详细活动中用于实现“向上”按钮的代码是:

switch (item.getItemId()) {
   case android.R.id.home:
      Intent intent = new Intent(this, MainActivity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
      return true;

我希望“向上”按钮的行为类似于“返回”按钮,而不是重新运行 onCreate()。但我不确定如何实现这一点,或者“返回”按钮实现哪个代码路径以返回主活动。

谢谢!

【问题讨论】:

标签: android android-actionbar


【解决方案1】:

不要开始一个全新的活动,只需完成你所在的细节活动

switch (item.getItemId()) {
   case android.R.id.home:
      finish();
      return true;

然后您将返回到活动堆栈上的上一个活动(您的主要活动)并且不应调用 onCreate

【讨论】:

  • 卫生署!现在为什么我没有想到呢?我想我试图太接近文档......谢谢!
  • 总是正确的解决方案。有时活动从另一个应用程序开始,up 应该启动父活动。更多信息在这里:developer.android.com/training/implementing-navigation/…
  • 是的,但是在谷歌解决方案中,onCreate 即使在堆栈中的活动时也会调用,你知道如何在活动已经存在时使用模拟“返回”功能,否则创建一个吗?
  • @shem 知道它迟到了(可能有一天会帮助某人)在你的 parentActivity 上使用 android:launchMode="singleTop"
  • @MuhammadBabar 非常感谢!也许这个答案与问题没有 100% 匹配,但这正是我最初寻找的优雅而简单的方式!
【解决方案2】:

如果您希望 Up 完全按照 Back 的方式执行操作,您可以这样做:

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

注意onBackPressed()的默认实现只调用finish(),但onBackPressed可以被覆盖。

【讨论】:

    【解决方案3】:

    我认为可以在this post找到更好的解决方案。

    调用finish() 在特定情况下有效,但可能并不总是产生in the documentation 描述的行为,例如:

    通过调用

    Intent intent = NavUtils.getParentActivityIntent(this); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    NavUtils.navigateUpTo(this, intent);
    

    您会以您离开时的状态返回父 Activity。如果你有一个扁平的应用结构,它仍然会像返回按钮一样工作。

    【讨论】:

    • 这应该是公认的答案,因为它将涵盖所有可能的情况,谢谢@Andy
    • 这与在清单中设置singleTop 相同,只是以编程方式。好答案
    • 尽管您的图表很有意义,但截至 2016 年 8 月 23 日的最新 Gmail 应用程序具有 ActionBar/ToolBar 后退箭头和系统后退按钮的行为完全相同
    【解决方案4】:

    对于真正的“家庭”功能,您应该在“应用程序/活动/重新排序活动”下查看 api 演示。

    原因:如果你有这样的东西:activity1->activity2->activity3,现在你想通过按操作栏上的主页按钮转到activity1?

    【讨论】:

    • 我只有两个活动,主要活动和详细活动。我总是想从详细的活动回到主要活动。我只是喜欢将 Actionbar 主页按钮作为另一种(直观)返回“主页”屏幕的方法,在这种情况下是主要活动。
    • 即便如此,你可以通过不关闭第二个活动来减少打开第二个活动的时间
    【解决方案5】:

    我相信最简单的方法是覆盖细节活动的“getParentActivityIntent”方法添加标志“Intent.FLAG_ACTIVITY_CLEAR_TOP”:

    @Nullable
    @Override
    public Intent getParentActivityIntent() {
        Intent intent = super.getParentActivityIntent();
        if (intent != null) {
            return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        }
        return intent;
    }
    

    【讨论】:

      【解决方案6】:

      还有另一种解决方案可供某人使用。当用户按下 Back 和 ActionbarBack 按钮时,我有同样的双重行为。我对 Back btn 行为很好。我不希望重新创建活动。所以我覆盖了方法

           @Override
      public boolean onSupportNavigateUp() {
          onBackPressed();
          return true;
      }
      

      适合我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多