4

我正在开发一个需要双语(英语/西班牙语)的 Android 应用程序。我允许用户从首选项中选择所需的语言,并根据所选语言在应用程序的主要活动(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);
}

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

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

我还尝试在主要活动以及其他活动上包含/排除 AndroidManifest.xml 中的“语言环境”属性,但我从未看到在本地更改后重新启动活动。话又说回来,“重启”将如何表现出来?它会调用onCreate()还是简单地调用onResume(),甚至是其他东西?如果这种方法会自动重新启动活动,并在语言环境更改时调用onCreate(),那么在我看来,关于如何实现这一点的具体指导听起来将是最佳途径。

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

4

2 回答 2

1

您可以使用 aBroadcastReceiver作为每个Activity用于选项卡内容的内部类。

在 中注册接收器onResume并在 中取消注册onPause

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

于 2012-05-23T21:55:41.203 回答
0

我实施了一个LocalBroadcastManager告诉感兴趣的各方关于语言环境的变化。问题是我无法更新我想要的所有内容,例如标签上的标签。事实证明,“主要”(Tab)活动中的以下内容效果最好:

    Intent intent = new Intent(mainActivity.getApplicationContext(), MainTabActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    mainActivity.startActivity(intent);
于 2012-05-30T20:20:58.600 回答