如何强制android重新加载main.xml

时间:2012-10-01 20:23:00

标签: android configuration locale

我正在开发一个项目,可以在应用程序中快速更改区域设置。主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),但它们都不起作用。任何想法/建议都将非常感激。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您需要做的是 - 只需致电setContentView(R.layout.main);。 Activity将根据区域设置自动更新UI。

这里有一个棘手的问题 - 如果你有一些动态数据(例如对按钮,文本视图等的引用),你可能也需要更新你的引用,因为旧的引用将不再相关。 / p>

答案 2 :(得分:0)

用于更改区域设置的代码最好移动到自定义Application类。你创建像MyApplication这样的东西,它扩展了onCreate / onConfiguration中的应用程序更改将是这样的代码:

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);

我希望我没有错过任何重要的内容,但这是动态更改语言的主要理念。