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

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

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

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

  • Android:如何在特定区域设置中获取字符串而不更改当前区域设置
  • 更改语言环境后刷新NavigationView菜单
  • 为什么java.text.DateFormat在Android上为en_US和en_GB返回相同的date格式?
  • 是否重置了区域设置,因为您的活动正在重新定向更改?

    如果是这样,您可以拦截或防止方向更改 : 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); ... }