完全停止或重新启动Android应用中的所有活动以反映新的语言选择

时间:2012-05-23 21:22:52

标签: android

我正在开发一款需要双语(英语/西班牙语)的Android应用。我允许用户从Preference中选择所需的语言,并根据所选语言在应用程序的主要活动(TabActivity的子类)中执行以下语言环境更改:

private void setApplicationLanguage(String languageCode)
{
    // Set the locale to the specified language code.
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.locale = new Locale(languageCode.toLowerCase());
    res.updateConfiguration(conf, dm);
}

主活动包含四个选项卡,每个选项卡都有自己的活动(有时是ActivityGroup)。我希望发生的是当语言发生变化时,所有打开的活动都会重新启动,这会导致他们的字符串以适当的语言重新加载。同样可接受(但不太理想)是完全破坏所有打开的活动,要求用户再次手动启动应用程序,因此所有字符串都将以适当的语言重新加载。

我尝试从主要活动中调用finish()导致该活动退出。但是,当我重新启动应用程序时,主活动“托管”的子活动(每个选项卡一个)仍然以先前的语言显示。我认为这是因为孩子的活动并没有递归“完成”给我。

我还尝试在主要活动以及其他活动中包含/排除AndroidManifest.xml中的“locale”属性,但我从未看到在本地更改时重新启动活动。那么,“重启”将如何表现出来呢?它会调用onCreate()还是只调用onResume(),甚至是其他内容?如果这种方法会自动重启活动,在语言环境发生变化时调用onCreate(),那么听起来就如何实现这一点的具体指导将是我案例中的最佳途径。

该解决方案需要在Android API级别7上运行,因此创建一个标有Intent的新FLAG_ACTIVITY_CLEAR_TASK显然不可用。

2 个答案:

答案 0 :(得分:1)

您可以使用BroadcastReceiver作为用于标签内容的每个Activity的内部类。

onResume中注册接收者,并在onPause中取消注册。

在更改区域设置时让主Activity发送'粘性'广播,并使用registerReceiveronResume的结果检索Intent以查看是否区域设置已更改。这也适用于任何“可见”Activity,以允许它动态更新数据。

答案 1 :(得分:0)

我实施了一个LocalBroadcastManager来告诉感兴趣的各方有关区域设置的更改。问题是我无法更新我想要的所有内容,例如: G。选项卡上的标签。结果最好的是“主要”(Tab)活动中的以下内容:

    Intent intent = new Intent(mainActivity.getApplicationContext(), MainTabActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    mainActivity.startActivity(intent);