我对android dev很新,我有一点本地化问题。 我有一个应用程序,用户可以选择使用其他默认语言而不是设备的当前语言。 例如,居住在德国且手机设置为“德语”的法国用户可能希望使用我的法语应用程序(出于各种原因),但不能用法语设置手机的默认语言。
我的应用只有一个活动,我加载和卸载一些视图。 这是一个非常简单的应用程序,但内容很大(文本和图像)。
为此,我使用下面的代码。
效果很好,但有一些问题:
当用户选择具有相应按钮的新语言并重新启动应用程序时(或者如果我强制应用程序完成()...):仅第一个视图使用新语言。下一个视图仍设置为上一个语言。
如果用户选择关闭他的设备,同样的问题:只将活动的第一个视图设置为选择的语言(从首选项中读取变量。)。
但是,如果用户选择第二次重新启动应用,则所有视图和子视图都会正确设置为新语言。
而且,如果用户之前已经重新启动了应用程序至少一次,则每次语言更改都会成功完成。无需再次重新启动应用程序。
那么,有没有办法正确设置新语言
如果用户之前已经关闭并打开了他的设备
任何帮助将不胜感激。 这是我使用的代码(简化):
public void onCreate(Bundle savedInstanceState) {
SharedPreferences myPrefs;
myPrefs = getSharedPreferences("langage", MODE_PRIVATE);
String langageToLoad = myPrefs.getString("langageToLoad", "");
changeLangage(langageToLoad);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
(...some other code...)
}
public void setLangageEn(View view){
changeLangage( "en");
setPreference( "en");
// finish(); // optionnal
}
public void changeLangage(String langage) {
Locale locale = new Locale(langage);
Locale systemLocale = Locale.getDefault();
if (systemLocale != null && systemLocale.equals(locale)) {
return;
}
Locale.setDefault(locale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
}
public void setPreference( String langage){
SharedPreferences languagepref = getSharedPreferences("langage",MODE_PRIVATE);
SharedPreferences.Editor editor = languagepref.edit();
editor.putString("langageToLoad",langage );
editor.commit();
}
答案 0 :(得分:0)
关注事物:仅仅因为你完成()一项活动,之前的活动不需要关闭,因此可以调用onResume()并只是“跳过”onCreate(),他们还没有忘记内存并且不调用onCreate()(在onResume()之前),在那里实现语言检查。
要避免此问题,可能是创建自定义“应用程序类”(扩展应用程序),然后检查localize-preference并使用getter和setter方法将其设置为字段。然后获取应用程序实例(在应用程序启动时创建!(而不是刚开始第二个活动时)。您可以在活动中执行((CustomApp)Context.getApplicationContext).getCustomLocalization()..
然而。要真正加载每个活动中的新语言设置,请确保在onResume()中检查它并将语言1.设置为CustomApp中的字段,并将2.更改为首选项(可能使用相同的setter方法?) 。然后完成()您的设置活动并重新创建它以加载新设置。