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

7
我有一个主活动(我们称之为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();
}

1
尝试查看 Intent 和 startActivityForResult 并将更新的语言传递回结果。 - chaitanya
3个回答

7

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

2) 在 Activity A 中执行以下操作:

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

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


@Drumnbass 你是如何设置你的文本的?你使用本地化字符串吗? - Droidman
是的,事实上整个应用程序都被翻译了(甚至是 A 上的上下文菜单)。唯一没有更新的是 A,即使重新创建它,我也不知道该说什么,这有点奇怪,但也很有趣 xD。 - Drumnbass
@Drumnbass 这并不是推荐的做法,但无论如何,您是否检查了在 Activity A 重新创建之后语言环境 实际上 是否已更改? - Droidman
我没有(至少观察它的值),但如果此时我再次转到B,它就被翻译了。 - Drumnbass
@Drumnbass 在 Activity 的 onCreate() 中添加一个区域设置检查,并在需要时再次更改它。您需要使用其他类来提供用户选择的当前区域设置。显式更改区域设置有点像“与系统作斗争”,因此请准备好进行多次检查。 - Droidman
显示剩余4条评论

4
您需要在Activity中实现onActivityResult()。这个链接有更多的信息,并且对您非常有帮助。简而言之:
在您的Activity A中,您需要创建一个变量作为请求代码,例如:
private static final int ACTIVITY_B_REQUEST = 0;

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

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

这将启动Activity B。每当Activity 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
@Droidman 你说得对,这可能有些过度了。除非他们需要从新的活动中获取信息,例如需要将其更改为哪种语言?对我来说,这似乎是正确的方法,因为他们想要使用ActivityA来处理ActivityB完成时发生的任何事情。 - AdamMc331
好的,我明白你的意思,尽管我更愿意在 OnResume() 中添加某种检查。也许这只是我的个人做法,因为我总是实现辅助类来监视重要设置的更改,并通知所有对这些更改感兴趣的订阅者;) - Droidman
@Droidman 当然。我还在学习中,只是试着积累一些经验来回答一些关于Android的问题。它们也教会了我一些新东西!你认为这个答案应该被删除吗? - AdamMc331
3
当然不会,因为你的例子已经清晰地回答了问题。这是一种极为罕见的情况,只有一个正确的答案存在。我并不认为你的答案有任何错误之处,只是分享了我的个人观点。 - Droidman
@Droidman 非常感激,我完全同意。只是想确保这不是“错误的”。 - AdamMc331

2

重新启动您的应用程序:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接