【发布时间】:2016-12-24 03:42:03
【问题描述】:
我正在使用以下代码在我的应用中设置特定语言。语言保存在应用程序内的SharedPreferences 中。 它在 API 级别 23 之前可以完美运行。 使用 Android N SharedPreferences 也可以正常工作,它返回正确的语言代码字符串,但不会更改语言环境(设置手机的默认语言)。有什么问题?
更新 1:当我在 res.updateConfiguration(config, dm) 之后立即使用 Log.v("MyLog", config.locale.toString()); 时,它会返回正确的语言环境,但应用程序的语言不会改变。
更新 2: 我还提到,如果我更改语言环境然后重新启动活动(使用新意图并在旧意图上完成),它会正确更改语言,甚至在之后显示正确的语言回转。但是当我关闭应用程序并再次打开它时,我会得到默认语言。这很奇怪。
public class ActivityMain extends AppCompatActivity {
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set locale
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
String lang = pref.getString(ActivityMain.LANGUAGE_SAVED, "no_language");
if (!lang.equals("no_language")) {
Resources res = context.getResources();
Locale locale = new Locale(lang);
Locale.setDefault(locale);
DisplayMetrics dm = res.getDisplayMetrics();
Configuration config = res.getConfiguration();
if (Build.VERSION.SDK_INT >= 17) {
config.setLocale(locale);
} else {
config.locale = locale;
}
}
res.updateConfiguration(config, dm);
setContentView(R.layout.activity_main);
//...
}
//...
}
更新 3: 答案也在这里: https://stackoverflow.com/a/40849142/3935063
【问题讨论】:
-
@CommonsWare 感谢重播,不幸的是这个链接没有帮助。现在我还提到,如果我更改语言环境,然后使用新意图重新启动活动并在旧意图上完成,它会正确更改语言,甚至在轮换后显示正确的语言(重新创建活动)。但是当我关闭应用程序并再次打开它时,我会得到默认语言。我不明白。这很奇怪。
-
@user35603 你找到解决办法了吗?
-
我向 Android 团队提交了一个错误,这里给出了答案:code.google.com/p/android/issues/detail?id=225679
标签: android locale android-7.0-nougat