有一种比使用反射或解析某些系统属性更简单、更清洁的方法来实现这一点。
当你在应用程序中设置默认语言环境后,你就无法再访问系统默认语言环境了。你在应用程序中设置的默认语言环境只在应用程序生命周期内有效。无论你在Locale.setDefault(Locale) 中设置什么都会在进程终止时消失。当应用程序重新启动时,你将能够再次读取系统默认语言环境。
因此,你所需要做的就是在应用程序启动时检索系统默认语言环境,只要应用程序运行,就将其记住,并在用户决定在Android设置中更改语言时进行更新。因为我们只需要这个信息在应用程序运行的时间内,所以我们可以将它简单地存储在一个静态变量中,该变量可以从应用程序的任何位置访问。
以下是如何实现:
public class MyApplication extends Application {
public static String sDefSystemLanguage;
@Override
public void onCreate() {
super.onCreate();
sDefSystemLanguage = Locale.getDefault().getLanguage();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
sDefSystemLanguage = newConfig.locale.getLanguage();
}
}
使用一个应用程序(不要忘记在您的清单文件中定义它),我们可以在应用启动时(onCreate())获取默认语言环境,并在用户在Android设置中更改语言时(onConfigurationChanged(Configuration))更新它。这就是全部。
每当您需要知道在使用setDefault调用之前系统默认语言是什么,sDefSystemLanguage将为您提供答案。
我在您的代码中发现了一个问题。当您设置新的Locale时,您所做的是:
Configuration config = new Configuration();
config.locale = locale;
pContext.getResources().updateConfiguration(config, null);
当你这样做时,你会覆盖所有可能想要保留的配置信息。例如,Configuration.fontScale反映了辅助功能设置中“大号字体”的设置。通过设置语言并且失去其他所有的配置信息,你的应用程序将不再反映“大号字体”设置,这意味着文本比应该小(如果用户已启用大号字体设置)。
正确的方法是:
Resources res = pContext.getResources();
Configuration config = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(locale);
}
else {
configuration.locale = locale;
}
res.updateConfiguration(config, null);
所以,我们不创建新的Configuration对象,而是更新当前的配置对象。