0

我正在开发一个项目以在应用程序中即时更改语言环境。主 UI 是在 res/layout/main.xml 中创建的。这是我的代码:

OnCreate() 
{
           ... ...
    Configuration config = getBaseContext().getResources().getConfiguration();
    config.locale = Locale.FRANCE;  // set locale to french
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    setContentView(R.layout.main);
}

结果:main.xml 中的 android:text="@string/myString" 正在 res/values-fr/strings.xml 中使用 myString,这正是我的预期。

在语言环境更改为意大利语的另一个函数中:

{   ... ...
    Configuration config = getBaseContext().getResources().getConfiguration();
    config.locale = Locale.ITALY;   // change locale to Italian
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}

在调用该函数之后, getString(R.string.myString) 正在 res/values-it/strings.xml 中使用 myString,这正是我所期望的。但是,主 UI 不会改变。main.xml 中的 android:text="@string/myString" 仍在 res/values-fr/strings.xml 中使用 myString,直到我强制 Activity 重新启动:

{
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

我试图调用 view.invalidate() 和 layoutInflater.inflate(R.layout.main, this) 但它们都不起作用。任何想法/建议将不胜感激。

4

3 回答 3

1

非常简单,当准备好更新时,确保您的 onCreate 方法可以正确处理它们,然后在您的活动上调用recreate(),Android 将关心娱乐并照常调用流程。

于 2012-10-01T21:14:18.453 回答
0

我真的很好奇你为什么要手动更改语言环境,因为它可以从设备设置中自动驱动,但让我们假装你是故意这样做的:)

你需要做的就是打电话setContentView(R.layout.main);。Activity 将根据区域设置自动更新 UI。

这里的棘手点是,如果您有一些动态数据(例如对按钮、文本视图等的引用),您可能还需要更新您的引用,因为旧的将不再相关。

于 2012-10-01T20:43:38.003 回答
0

用于更改语言环境的代码最好移至您的自定义应用程序类。您创建类似 MyApplication 的东西,它在 onCreate/onConfiguration 更改中扩展 Application 将是这样的代码:

String lang = getSharedPreferences(PREFS_APP, 0).getString(LANGUAGE, Locale.getDefault().getLanguage());
locale = new Locale(lang);
if (locale != null) {
 newConfig.locale = locale;
 Locale.setDefault(locale);
 getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
}

你在 AndroidManifest 部分注册这个自定义类 Application ( android:name=".MyApplication")
这个想法是 Android 不喜欢设置在系统中设置的不同语言环境。
在您的设置活动中更改区域设置后执行此操作:

Configuration c = new Configuration();
Locale newLocale = new Locale(localeCode);
Locale.setDefault(newLocale);
c.locale = newLocale;
ctx.getResources().updateConfiguration(c, ctx.getResources().getDisplayMetrics());

然后像这样重新启动/返回您的 MainActivity:

Intent goTo = new Intent(ctx, MainActivity.class);
goTo.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
act.startActivity(goTo);

我希望我没有错过一些重要的事情,但这是动态更改语言背后的主要思想。

于 2012-10-01T20:52:13.200 回答