我正在使用以下代码在我的应用程序中设置特定语言.语言将保存到应用程序内的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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)