Android – 针对方向更改强制重置语言环境

我尝试强制我的应用程序中的区域设置为指定的用户。 由于这可能用于演示,我想改变应用程序的语言/区域设置,而不是整个设备的任何时间。

我环顾四周,试图用我在这里find的每一个提示。 结果是:我可以用新的语言重新开始我的testing活动,但是如果我改变了方向,语言环境将总是被重设到设备之一。

我上传了一个简约的项目,所以你可以重现我的问题。 请忽略UI的缩小,这不重要:)

Solutions Collecting From Web of "Android – 针对方向更改强制重置语言环境"

是否重置了区域设置,因为您的活动正在重新定向更改?

如果是这样,您可以拦截或防止方向更改 : Android上的轮播重新启动

这段代码可以完成你所需要的,我已经testing过了。 假设您希望用户能够通过主要活动的菜单切换语言。 你可以通过保存一个语言标志作为用户的偏好,并在“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。 您的代码不会更改手机的区域设置。

testing它:

  • 我把我的手机设置为西class牙语。
  • 打开你的应用程序
  • 点击button
  • 回家
  • 图标用西class牙语而不是英语。

如果你想要做的只是设置区域设置为默认值,并能够在屏幕旋转后看到相同的值:

代替:

 android:configChanges="locale" 

使用:

 android:configChanges="locale|orientation" 

你应该强制你的语言环境在Application :: onCreateApplication :: onConfigurationChanged 。 别忘了在AndroidManifest.xml中注册你的Application类

我的工作是在膨胀布局之前设置语言环境:

 @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); ... }