为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2021-12-18 09:58:16
当我的设备语言不是英语(例如葡萄牙语)时,我无法更改语言。这是我的代码:  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 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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


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


@Override

protected void attachBaseContext(Context base) {

    super.attachBaseContext(updatedConfigurationContext(base));

}

并从 getApplicationContext().createConfigurationContext(configuration);


正如你在上面所做的那样。


查看完整回答
反对 回复 2021-12-18
?
冉冉说

TA贡献1877条经验 获得超1个赞

不知道你想在哪里做这个,所以我只是假设它在一个活动中。这个答案也在 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))

}

上下文包装器:


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()在您的活动中使用以重新启动您的活动上下文。


查看完整回答
反对 回复 2021-12-18
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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

getActivity().recreate();


查看完整回答
反对 回复 2021-12-18
  • 3 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信