在运行时更改语言环境?

我们有一个Android应用程序,用作远程PC程序的客户端。 我们希望添加一个function,以便PC可以指示Android应用程序在运行时更改其区域设置,即启动应用程序; 把它与电脑沟通; 稍后PC会告诉应用程序切换到西class牙语或中文。

我们已经为各自的区域设置了所有的布局和string资源。 我们的应用程序是用户看到的唯一应用程序,因此如果设备的其余部分保持英语,则无关紧要。

在Android上有另一个编程语言的线程,但它似乎没有得出结论。

我可以放。 。 。

Locale locale = new Locale(sTheNewLocale); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

。 。 。 在setContentView ()之前的onCreate()中 ,但是如果我想在屏幕启动并运行后更改区域设置,那么这并没有什么帮助。 在Activity已经运行之后,有没有办法重新加载内容视图? 那么是否有切实可行的方法可靠地更改区域设置,还是必须告诉我的老板,除非在启动应用程序之前将整个设备设置为新的区域设置,否则无法完成此任务?

由于API 11可以使用recreate因此可以在您的活动中使用此方法:

 private void restartInLocale(Locale locale) { Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; Resources resources = getResources(); resources.updateConfiguration(config, resources.getDisplayMetrics()); recreate(); } 

您可以开始一个新的活动实例并退出旧活动。 这是一个完整的(未经testing的)示例,您可以如何存储任何所需的语言并重新启动您的应用程序。 你只需要用你的首选语言来调用restartInLanguage

 public class YourMainActivity extends Activity { private static final String APP_SHARED_PREFS = "com.example.test"; private SharedPreferences settings; private Editor editor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settings=getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); editor=settings.edit(); Locale locale = new Locale(settings.getString("lang", "default-lang")); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getResources().updateConfiguration(config, getResources().getDisplayMetrics()); // your stuff... } public void restartInLanguage(String lang) { editor.putString("lang", lang); editor.commit(); Intent intent = getIntent(); finish(); startActivity(intent); } // ... } 

我已经结合@weston和@rekire(都是+1),并且扩展它来处理这个用例:

  • ActivityA => ActivityB => SettingsActivity-changeLocale

SettingsActivitychangeLocale之后,还应该重新创build父活动ActivityAActivityB以反映新的区域设置。

我的解决scheme:ActivityA和ActivityB从LocalizedActivityinheritance,它检查onResume如果语言环境已更改,并在必要时触发recreate()

因此,从LocalizedActivityinheritance的每个活动都会自动处理应用程序特定的区域设置更改。

 /** * An activity that can change the locale (language) of its content. * * Inspired by http://stackoverflow.com/questions/13181847/change-the-locale-at-runtime * * Created by k3b on 07.01.2016. */ public class LocalizedActivity extends Activity { /** if myLocale != Locale.Default : activity must be recreated in on resume */ private Locale myLocale = null; @Override protected void onCreate(Bundle savedInstanceState) { fixLocale(this); super.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); // Locale has changed by other Activity ? if ((myLocale != null) && (myLocale.getLanguage() != Locale.getDefault().getLanguage())) { myLocale = null; recreate(); } } /** * Set Activity-s locale to SharedPreferences-setting. * Must be called before onCreate * @param context */ public static void fixLocale(Context context) { final SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(context); String language = prefs.getString(Global.PREF_KEY_USER_LOCALE, ""); Locale locale = Global.systemLocale; // in case that setting=="use android-locale" if ((language != null) && (!language.isEmpty())) { locale = new Locale(language); // overwrite "use android-locale" } if (locale != null) { Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; Resources resources = context.getResources(); resources.updateConfiguration(config, resources.getDisplayMetrics()); // recreate(); if (context instanceof LocalizedActivity) { ((LocalizedActivity) context).myLocale = locale; } } } } 

以下是我的A Photo Manager项目中使用的LocalizedActivity.java和SettingsActivity.java的来源

解决方法是在设置语言环境之后,使用onResume方法中的每个活动中的setContentView和controlLanguage(您也可以从Global类中调用此方法)方法。 例:

 @Override public void onClick(View v) { SharedPreferences.Editor editor; editor = sharedPref.edit(); Configuration config = new Configuration(getBaseContext().getResources().getConfiguration()); String language = ""; switch (v.getId()){ case R.id.turkceButton: editor.putString("language", "tr"); language="tr"; break; case R.id.englishButton: editor.putString("language", "en"); language="en"; break; } Locale locale = new Locale(language); Locale.setDefault(locale); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); editor.commit(); @Override protected void onResume() { super.onResume(); controlLanguage(getApplicationContext(), getResources()); setContentView(R.layout.main); } public void controlLanguage(Context context, Resources res){ SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); String language = sharedPref.getString("language","en"); Locale locale = new Locale(language); Locale.setDefault(locale); res.getConfiguration().locale = locale; res.updateConfiguration(res.getConfiguration(), res.getDisplayMetrics()); }