【问题标题】:Restarting the previous activity by pressing back button按后退按钮重新启动上一个活动
【发布时间】:2012-12-21 19:52:11
【问题描述】:

我正在制作一个应用程序,其中有一个“MainActivity.class”,该应用程序有一个“编辑配置文件”按钮,该按钮通向另一个活动,称为“Editprofile.class”。它(MainActivity)还有一个 TextView,它显示一个字符串(名称)。

Editprofile.class 接受来自用户的字符串,并在按下按钮“添加”时,将新字符串更新到数据库,替换之前的字符串。现在,当用户在更新后通过后退按钮返回 MainActivity 时,我希望 TextView 显示新更新的字符串;为此我必须重新启动 MainActivity。

当用户按下“编辑配置文件”按钮时,我通过使用 finish() 函数实现了这一点,并且当用户在 Editprofile 活动期间按下后退按钮时,MainActivity 通过 onBackPress() 方法重新启动。

意图启动“Editprofile.class”的代码:

public void edit_profile(View view)  {                                                
    Intent intent = new Intent(this, Editprofile.class)
    startActivity(intent)  
    finish();
  }

返回“MainActivity”的代码:

@Override
public void onBackPressed() {
    finish();
    startActivity(new Intent(this, MainActivity.class));
}

我已经设法得到我想要的结果,但如果有人能告诉我这是否是最有效的方法,我将不胜感激。

我应该以 Q/A 格式发布吗?

【问题讨论】:

  • 根据我的经验,您无需编写任何代码即可使“后退”按钮返回上一个活动。这是默认行为。
  • @Code-Guru 是的,我知道这一点。但我也想“刷新” MainActivity 以便在返回时显示新更新的名称;否则在更新数据库时仍会显示以前的名称。
  • “新更新的名称”从何而来?据我了解,在 Activity 重新启动时更新 Activity 的首选解决方案是使用 onResume() 回调,而不是杀死 Activity 并尝试创建一个新的。
  • 其实我强烈建议你研究一下Activity的生命周期。我认为这将帮助您以安全地使用底层平台的方式解决您的问题。
  • @Code-Guru 你是对的。我应该使用 onResume()。谢谢! “新更新的名称”来自我之前创建的 SQLite 数据库。

标签: java android


【解决方案1】:

@Mattias 答案的替代方法是使用 startActivityForResult(...) 启动 Editprofile。然后,该活动可以返回一个结果,指示用户是否实际编辑了他/她的个人资料,您将能够在onActivityResult(...)MainActivity 中捕获该结果。仅当配置文件更改时,TextView 才需要更新。

这可能需要几行额外的编码,但比每次onResume() 被击中时更新效率略高。在我看来它也更干净一些,虽然就性能而言它可能不会有什么大不了的。

例如,请查看 Android 开发者网站上的 documentation

【讨论】:

  • +1 这绝对是比我建议使用onResume() 更好的解决方案。
【解决方案2】:

但我也想“刷新” MainActivity,以便在返回时显示新更新的名称;

onResume() 方法可以处理这类事情。

【讨论】:

    【解决方案3】:

    我建议使用startActivityForResult() 并在onActivityResult() 中更新您的MainActivity

    (无需检查onResume() 中的更新,因为除了从Editprofile 返回之外,许多 其他实例都会调用此方法。)

    【讨论】:

      【解决方案4】:

      只是:

      • 删除finish() 调用edit_profile()
      • 删除整个onBackPressed()方法

      因为您不需要重新启动活动(现在它将恢复,即:更快、更好、更容易且符合预期)。更新 onResume() 中的 TextView 而不是 onCreate()

      【讨论】:

      • edit_profile()中删除finish()意味着OP可以完全删除onBackPressed()
      • 谢谢!我知道我用了这么多饰面做错了什么。
      【解决方案5】:

      不要在程序中的任何地方使用/覆盖 onBackPressed()

      只要在父Activity中添加如下方法如MainActivityEditProfile即可

      在 MainActivity.java 中

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
      }
      

      使用您的 onClick 方法启动 Activity

          startActivityForResult(intentName, 0);
      

      在 EditProfile.java 中

      您使用/覆盖 onStop() 方法

          @Override
      protected void onStop()
      {
          super.onStop();
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        相关资源
        最近更新 更多