如何重新创建以前的活动?

Posted

技术标签:

【中文标题】如何重新创建以前的活动?【英文标题】:How to recreate previous activity? 【发布时间】:2015-05-20 07:39:38 【问题描述】:

我有一个主要活动(我们称之为 A)和第二个活动(我们称之为 B),用于更改应用程序的语言。关键是,当我单击按钮更改语言时,我也会调用recreate();,B 会更改它的语言。到这里为止还好。当我回到主要活动(A)并且它没有更新语言时,问题就出现了,因为它没有被重新创建,那么,有没有办法从 B 重新创建 A 以更新 A?

我使用此代码翻译应用程序(英文版示例):

public void btnIngles_onClick(View v)

    Locale locale = new Locale("en");
    Locale.setDefault(locale);

    Configuration config = new Configuration();
    config.locale = locale;
    this.getApplicationContext().getResources().updateConfiguration(config, null);
    recreate();

【问题讨论】:

尝试查看 Intent 和 startActivityForResult 并将更新后的语言传递回结果 【参考方案1】:

1) Activity B 更改了一些全局设置,例如通过 SharedPreferences 访问

2) 在Activity A 做:

@Override
protected void onResume() 
    super.onResume();
    if(didLanguageChange)
      recreate();

问题解决了。 Activity A 调用onResume(),因为当Activity B 进入前台时它已切换到暂停状态。

【讨论】:

我做到了,它调用了 recreate() 方法,但活动语言没有改变.. :( protected void onResume() super.onResume(); if (idioma.compareTo(Locale.getDefault().getLanguage()) != 0) this.recreate(); 我检查了条件返回 true 并且语言改变了,但正如我所说, A 不会改变它的语言。 @Drumnbass 你如何设置你的文本?你使用本地化字符串吗? 是的,事实上,整个应用程序都会被翻译(甚至是 A 上的上下文菜单)。唯一不更新的就是A连重新制作了,不知道说什么,有点奇怪,不过也很好笑xD @Drumnbass android 使用系统区域设置/语言来确定要获取哪些本地化字符串。你如何改变语言?您是否手动更改语言环境? 是的,我已经编辑了我的帖子,向您展示了我用来更改语言的代码。也许我做错了什么,但无论如何该应用程序都会被翻译,我认为它与问题无关。但你是这里的主人,让我们看看你的想法!【参考方案2】:

重启你的应用:

startActivity(new Intent(this, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent
                .FLAG_ACTIVITY_CLEAR_TOP));

【讨论】:

【参考方案3】:

您需要在 Activity 中实现 onActivityResult()。这个link 有更多信息,应该对你很有帮助。简而言之:

在您的活动 A 中,您需要创建一个用作请求代码的变量,如下所示:

private static final int ACTIVITY_B_REQUEST = 0;

然后,在按钮的 onClick 侦听器中,您将使用意图和 startActivityForResult() 函数启动活动:

Intent myIntent = new Intent(ActivityA.this, ActivityB.class);
startActivityForResult(myIntent, ACTIVITY_B_REQUEST);

这将为您启动活动 B。每当活动 B 完成时,onActivityResult 将被调用。您可以覆盖它并以您需要的任何方式实现它,但它可能看起来像这样:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    if(requestCode == ACTIVITY_B_REQUEST && resultCode == RESULT_OKAY)
        // Handle this by doing what you need to refresh activity A.
     else
        super(requestCode, resultCode, data);
       

【讨论】:

恕我直言,启动Activity 以获得结果只是为了检查它是否更改了某些设置是不是有点矫枉过正? @Droidman 你是对的,这可能是矫枉过正。除非他们需要从新活动中返回信息,例如需要将其更改为哪种语言?这对我来说似乎是正确的方法,因为他们想使用 ActivityA 来处理 ActivityB 完成时发生的任何事情。 好吧,我明白你的意思,但我宁愿在OnResume() 中添加某种检查。也许这只是我个人的方法,因为我总是实现帮助类来监控重要设置的变化并通知所有对这些变化感兴趣的订阅者;) @Droidman 绝对是。我仍在学习,只是想获得一些经验,将一些 Android 答案放在那里。他们也教会了我一些新东西!你认为这个答案应该被删除吗? 当然不是,因为您的示例为该问题提供了一个干净且有效的答案。只有一个正确答案存在的情况非常罕见。我不会以任何方式考虑您的回答“错误”,只是分享我的个人意见

以上是关于如何重新创建以前的活动?的主要内容,如果未能解决你的问题,请参考以下文章

系统杀死应用程序后,Android 没有重新打开以前的活动

如何检查android是不是要重新创建活动或销毁?

重新创建活动时出现 SQLiteDatabase 错误

重新创建活动时如何从 AsyncTask 更新 TextView

如何从 php 脚本更改活动的字符串值并重新创建 apk 文件

如何防止片段在活动重新创建时触发 onCreate onCreateView