我的用户可以更改应用内的区域设置(他们可能希望将手机设置保留为英文,但可以用法语,荷兰语或任何其他语言阅读我的应用内容...)
为什么这个在1.5/1.6中完全正常但在2.0中不再是???
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case 201:
Locale locale2 = new Locale("fr");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(
config2, getBaseContext().getResources().getDisplayMetrics());
// loading data ...
refresh();
// refresh the tabs and their content
refresh_Tab ();
break;
case 201: etc...
Run Code Online (Sandbox Code Playgroud)
问题是,每当用户通过以上代码行时,MENU"缩小"越来越多......
这是缩小的菜单:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass);
SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
langMenu.add(1, 201, 0, "Nederlands");
langMenu.add(1, 202, 0, "Français");
menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send);
menu.add(0, 300, …Run Code Online (Sandbox Code Playgroud) 我真的很痛苦这个问题.我已经设置了旗帜android:configChanges="keyboardHidden|orientation|locale"
但是当我改变语言的配置时,onconfigurationchanged不会调用函数.奇怪的是,我的代码在其他Android平台上运行良好.
我在这里搜索了这个问题.有人说我需要将sdk版本设置得更低.但它没有用.
请给我一些提示.
我正在使用下面的代码在按钮点击时更改我的应用程序语言(例如从法语更改为英语),它在Android 4.0 +上工作正常但在5.0上却没有.
Locale localeEn = new Locale("en_US");
Locale.setDefault(localeEn);
Configuration configEn = new Configuration();
configEn.locale = localeEn;
getApplicationContext().getResources().updateConfiguration(configEn, null);
this.recreate();
Run Code Online (Sandbox Code Playgroud)
有什么线索为什么好吗?
编辑:这是我的清单(使用android:configChanges)
<activity
android:name=".activities.LoginActivity"
android:configChanges="orientation|locale"
android:label="@string/app_name"
android:screenOrientation="portrait"/>
Run Code Online (Sandbox Code Playgroud) 我想要做的是在应用程序中为用户提供简单的语言更改。当前视图的文本以及 Back Stack 应替换为所选语言的字符串。我刚刚编写了以下代码片段,它可以很好地完成他的工作:
private void setLocale(Locale locale) {
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我发现,在更改语言环境配置后,每个活动都应该自动刷新自己 - 但在我的情况下不是这样。当前视图以及整个 Back Stack 仍然具有默认语言环境 - 它们只是在重新打开 Activity 后发生变化。
我已经将属性添加android:configChanges="locale|layoutDirection"到我的,AndroidManifest.xml所以不会成功。
大家有什么建议吗?或者我是否有错误的目的来解决这个问题?
编辑
好吧,似乎OnConfigurationChanged()只能通过在 android 设置中更改设备范围内的语言来触发?
更改应用程序中的语言后,是否还有其他方法可以刷新每个活动活动(当前和返回堆栈)?
安装我的应用程序后,首次运行时会要求用户选择语言; 但是如果用户第二次启动应用程序,则会自动设置语言(以前选择的语言).
问题是,在用户选择语言的第一次运行时,app仍然是英文的(无论用户选择什么语言),但如果我旋转设备,则语言被更改为正确的(到选定的一个).应用程序第二次运行时出现同样的问 应用程序以英语启动,但在轮换语言更改为正确之后.
有什么建议?先感谢您
这里是我更改语言的MainActivity代码:
private void initApp() {
if (Settings.getLanguage().equals("")){
String[] items = { getResources().getString(R.string.lang_eng), getResources().getString(R.string.lang_geo)};
showDialogSingleChoise(items, getResources().getString(R.string.select_language_title), 0, false, false, this.languageSelectedListener, this.languageConfirmedListener, null);
} else {
System.out.println("initApp: " + Settings.getLanguage());
Settings.setLanguage(MainActivity.this.getResources(), Settings.getLanguage());
appVersionCheck();
}
}
private OnClickListener languageConfirmedListener = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Settings.setLanguage(MainActivity.this.getResources(), MainActivity.this.language);
appVersionCheck();
}
};
Run Code Online (Sandbox Code Playgroud)
这里是来自设置的代码片段:
public static void setLanguage(Resources res, String langString){
System.out.println("lang in pref: " + langString);
setStringProperty(PREFS_LANG ,langString);
MainApp.getInstance().setLocale(res);
}
Run Code Online (Sandbox Code Playgroud)
这是我的Application类:
public class MainApp …Run Code Online (Sandbox Code Playgroud) 我想以编程方式更改语言.
所以我构建了两个xml文件.
values-it
-->string.xml
values-en
-->string.xml
Run Code Online (Sandbox Code Playgroud)
这是MainActivity中用于更改整个应用程序语言的代码:
//意大利
Resources res = getApplicationContext().getResources();
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("it");
res.updateConfiguration(conf, dm);
Run Code Online (Sandbox Code Playgroud)
//英语
Resources res2 = getApplicationContext().getResources();
DisplayMetrics dm2 = res2.getDisplayMetrics();
android.content.res.Configuration conf2 = res2.getConfiguration();
conf2.locale = new Locale("en");
res2.updateConfiguration(conf2, dm2);
Run Code Online (Sandbox Code Playgroud)
现在,如果我设置英语(例如),代码执行时没有错误,但标签不会更改其文本.
如果我更改设备的方向,标签会正确更改其文本.
现在我如何修改我的代码以自动刷新标签?