以编程方式更改语言(Android N 7.0–API 24)

以编程方式更改语言(Android N 7.0–API 24),第1张

概述我正在使用以下代码在我的应用程序中设置特定语言.语言将保存到应用程序内的SharedPreferences中.并且它完全符合API级别23.使用AndroidNSharedPreferences也能很好地工作,它返回正确的语言代码字符串,但它不会更改区域设置(设置手机的默认语言).可能有什么不对?更新1:当我使用Log

我正在使用以下代码在我的应用程序中设置特定语言.语言将保存到应用程序内的SharedPreferences中.并且它完全符合API级别23.使用Android N SharedPreferences也能很好地工作,它返回正确的语言代码字符串,但它不会更改区域设置(设置手机的默认语言).可能有什么不对?

更新1:当我使用Log.v(“MyLog”,config.locale.toString());在res.updateConfiguration(config,dm)之后立即返回正确的语言环境,但应用程序的语言没有改变.

更新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

解决方法:

创建一个新的类扩展Contextwrapper

public class MyContextwrapper extends Contextwrapper {    public MyContextwrapper(Context base) {        super(base);    }    @TargetAPI(Build.VERSION_CODES.N)    public static Contextwrapper wrap(Context context, Locale newLocale) {        Resources res = context.getResources();        Configuration configuration = res.getConfiguration();        if (VersionUtils.isAfter24()) {            configuration.setLocale(newLocale);            LocaleList localeList = new LocaleList(newLocale);            LocaleList.setDefault(localeList);            configuration.setLocales(localeList);            context = context.createConfigurationContext(configuration);        } else if (VersionUtils.isAfter17()) {            configuration.setLocale(newLocale);            context = context.createConfigurationContext(configuration);        } else {            configuration.locale = newLocale;            res.updateConfiguration(configuration, res.getdisplayMetrics());        }        return new Contextwrapper(context);    }}

覆盖Activity的attachBaseContext方法

@OverrIDeprotected voID attachBaseContext(Context newBase) {    Locale languageType = LanguageUtil.getLanguageType(mContext);    super.attachBaseContext(MyContextwrapper.wrap(newBase, languageType));}

完成活动并再次启动它,新的语言环境将变得有效.

演示:https://github.com/fanturbo/MultiLanguageDemo

总结

以上是内存溢出为你收集整理的以编程方式更改语言(Android N 7.0 – API 24)全部内容,希望文章能够帮你解决以编程方式更改语言(Android N 7.0 – API 24)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存