Java Android在应用程序中更改并设置默认语言环境

Java Android在应用程序中更改并设置默认语言环境,java,android,localization,locale,globalization,Java,Android,Localization,Locale,Globalization,我正在致力于Android应用程序的全球化。我必须提供从应用程序中选择不同地区的选项。我在我的活动(HomeActivity)中使用以下代码,其中我提供了更改区域设置的选项 Configuration config = new Configuration(); config.locale = selectedLocale; // set accordingly // eg. if Hindi then selectedLocale = new Locale("hi"); Locale.setD

我正在致力于Android应用程序的全球化。我必须提供从应用程序中选择不同地区的选项。我在我的活动(HomeActivity)中使用以下代码,其中我提供了更改区域设置的选项

Configuration config = new Configuration();
config.locale = selectedLocale; // set accordingly 
// eg. if Hindi then selectedLocale = new Locale("hi");
Locale.setDefault(selectedLocale); // has no effect
Resources res = getApplicationContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
只要不存在诸如屏幕旋转之类的配置更改(其中区域设置默认为android系统级别的区域设置,而不是代码设置的区域设置),这就可以正常工作

Locale.setDefault(selectedLocale);
我能想到的一个解决方案是使用SharedReferences持久化用户选择的区域设置,并且在每个活动的onCreate()方法中,当每次配置更改都一次又一次地调用onCreate()时,将区域设置设置为持久化的区域设置。有没有更好的方法来做到这一点,这样我就不必在每项活动中都这么做了。


基本上,我想要的是——一旦我在我的HomeActivity中更改/设置了某个区域设置,我希望我的应用程序中的所有活动都使用该区域设置本身,而不考虑任何配置更改……除非和直到它从提供更改区域设置选项的应用程序HomeActivity更改为其他区域设置。

尽管解决方案在这个回答中,我发现自己在一般情况下会添加到我的首选项屏幕:

 <activity android:name="com.example.UserPreferences"
     android:screenOrientation="landscape"
     android:configChanges="orientation|keyboardHidden|screenSize">
 </activity>
然后你必须在清单上写下:

<application android:name="com.example.MyApplication" ...>
  ...
</application>

...

如果我使用英语。我将称之为
updateLanguage(这是“en”)对吗?或者尝试使用
updateLanguage(这是Locale.US.getDisplayLanguage())不适用于我。字符串“locale\u override”应替换为您首选的指向该语言的任何键。这是一个很好的解决方案。但不幸的是,当我调试时,它只能在运行Android 4.4.2的Galaxy S4上运行。正常运行时,它不会更改语言,但会在LogCat中生成大量额外的输出。解决方案是在我的主要活动的onCreate方法中调用静态方法updateLanguage(ctx),而不是在应用程序的onCreate中。但在这种情况下,我不需要派生类应用程序。中建议了备选方案。是否有理由将
updateConfiguration()
定义为
static
@MikaëlMayerSolutions可在中找到。
<application android:name="com.example.MyApplication" ...>
  ...
</application>