我尝试将我的应用程序中的语言环境强制为用户指定的语言环境。由于这可能用于演示,我想更改应用程序中的语言/区域设置,而不是随时更改整个设备。
我环顾四周并尝试使用我在这里找到的每一个提示。结果:我可以用新语言重新开始我的测试活动,但如果我改变方向,语言环境将始终重置为设备一。
我上传了一个简约项目,以便您可以重现我的问题。请忽略 UI 的缩小,这并不重要 :)
我尝试将我的应用程序中的语言环境强制为用户指定的语言环境。由于这可能用于演示,我想更改应用程序中的语言/区域设置,而不是随时更改整个设备。
我环顾四周并尝试使用我在这里找到的每一个提示。结果:我可以用新语言重新开始我的测试活动,但如果我改变方向,语言环境将始终重置为设备一。
我上传了一个简约项目,以便您可以重现我的问题。请忽略 UI 的缩小,这并不重要 :)
此代码片段可以满足您的需要,我已经对其进行了测试。假设您希望用户能够通过主活动中的菜单切换语言。您可以通过将语言标志保存为用户首选项并在“onCreate()”和“onConfigurationChanged()”上进行检查,如下所示:
public class MainActivity extends Activity {
SharedPreferences mPrefs1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.activity_main);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.activity_main);
}
// Declaring the Menu options
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
//handle menu item selection
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
case R.id.menu_switch_language:
String languageToLoad = getResources().getString(R.string.switch_language);
mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = mPrefs1.edit();
editor.putString("languagePref", languageToLoad);
editor.commit(); // Very important to save the preference
finish();
startActivity(getIntent());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
我刚看到你的代码。
检查Locale
您使用的是否来自 java.util 而不是来自 android。您的代码不会更改手机的区域设置。
要测试它:
如果您尝试做的只是将 Locale 设置为默认值并能够在屏幕旋转后看到相同的值:
代替:
android:configChanges="locale"
采用:
android:configChanges="locale|orientation"
对我有用的是在扩展布局之前设置语言环境:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String userLocale = "Wolof"; // adapt to your need
Locale locale = new Locale(userLocale);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.my_activity);
...
}
是否因为您的活动在方向更改时重新启动而发生区域设置重置?
如果是这样,您可以拦截或阻止方向更改:Activity restart on rotation Android
您应该在Application::onCreate和Application::onConfigurationChanged中强制使用您的语言环境。不要忘记在AndroidManifest.xml中注册您的 Application 类