我正在开发一款需要双语(英语/西班牙语)的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
显然不可用。
答案 0 :(得分:1)
您可以使用BroadcastReceiver
作为用于标签内容的每个Activity
的内部类。
在onResume
中注册接收者,并在onPause
中取消注册。
在更改区域设置时让主Activity
发送'粘性'广播,并使用registerReceiver
中onResume
的结果检索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);