设备默认语言不是英语时,更改语言不起作用

时间:2018-10-30 12:19:15

标签: java android

当我的设备语言不是英语(例如葡萄牙语)时,我无法更改语言。 这是我的代码:

  Locale locale = new Locale("en");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getResources().updateConfiguration(config,
                context.getResources().getDisplayMetrics());

我检查了其他类似这样的请求,但是它也不起作用

SharedPrefUtils.saveLocale(locale); // optional - Helper method to save the selected language to SharedPreferences in case you might need to attach to activity context (you will need to code this)
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    configuration.setLocale(locale);
} else{
    configuration.locale=locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
    getApplicationContext().createConfigurationContext(configuration);
} else {
    resources.updateConfiguration(configuration,displayMetrics);
}

那我怎么了?

3 个答案:

答案 0 :(得分:0)

更改默认语言环境后,您可能需要重新创建活动。

getActivity().recreate();

答案 1 :(得分:0)

您需要将新的配置上下文传递给ContextWrapper超类。

在您的活动中覆盖attachBaseContext并将新的上下文传递为-

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(updatedConfigurationContext(base));
}

并从中返回新上下文     getApplicationContext().createConfigurationContext(configuration);

就像上面一样。

答案 2 :(得分:0)

不知道您想在哪里执行此操作,因此我只是假设它在活动中。同样,这个答案在Kotlin中,如果您想在Java中查看以下帖子: How to convert a kotlin source file to a java source file

活动

override fun attachBaseContext(ctx: Context?) {
    super.attachBaseContext(ContextWrapper.wrap(ctx, yourLocale))
}

ContextWrapper

class ContextWrapper(context: Context?) : android.content.ContextWrapper(context) {
    companion object {
        fun wrap(context: Context?, locale: Locale): ContextWrapper {
            val configuration = context?.resources?.configuration
            configuration?.setLocale(locale)

            if (Build.VERSION.SDK_INT >= 24) {
                val localeList = LocaleList(locale)
                LocaleList.setDefault(localeList)
                configuration?.locales = localeList
            }

            val ctx = if(configuration != null) context.createConfigurationContext(configuration) else null
            return ContextWrapper(ctx)
        }
    }
}

重新创建您的上下文(活动)

在活动中使用recreate()重新启动活动上下文。