1.当APP第一次打开时,如果默认语言和手机语言不一致,则需要先在Application的onCreate中调用使用语言
@Override
public void onCreate() {
super.onCreate();
...
//设置APP语言
if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效
//这里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
//LanguageUtils.applyLanguage(locale);
//由于上面这个方法会造成闪屏,所以将内部方法提取为下面的写法
SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
}
...
}
2.调用LanguageUtils.updateAppContextLanguage更新Application的语言
@Override
public void onCreate() {
super.onCreate();
...
//修改Application的语言
LanguageUtils.updateAppContextLanguage(locale, null);
...
}
3.修复StringUtils获取string的语言
@Override
public void onCreate() {
super.onCreate();
...
//修复StringUtils获取string的语言
LanguageUtil.applyLanguage(this, this.getResources(), locale);
...
4.由于LanguageUtils中的语言更新并没有更新到Resources.getSystem()中的语言,所以以防万一,我们再更新一下Resources.getSystem()中的语言,代码可以参考LanguageUtils中的更新方法
@Override
public void onCreate() {
super.onCreate();
...
if (ProcessUtils.isMainProcess()) {
//修复WebView导致的语言切换失效,要放到设置语言前
new WebView(this).destroy();
//当前语言
Locale locale = LanguageUtil.getCurrentLanguageLocale();
//设置APP语言
if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效
//这里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
//LanguageUtils.applyLanguage(locale);
//由于上面这个方法会造成闪屏,所以将内部方法提取为下面的写法
SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
}
//修改Application的语言
LanguageUtils.updateAppContextLanguage(locale, null);
//修改Resources.getSystem()的语言
LanguageUtil.applyLanguage(this, Resources.getSystem(), locale);
//修复StringUtils获取string的语言
LanguageUtil.applyLanguage(this, this.getResources(), locale);
...
}
}
部分调用方法:
//获取当前语言
public static Locale getCurrentLanguageLocale() {
Locale locale = LanguageUtils.getAppliedLanguage();
if (locale == null) {
return Locale.US;
} else {
return locale;
}
}
//设置当前语言
public static void applyLanguage(Context context, Resources resources, Locale locale) {
Configuration config = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList localeList = new LocaleList(locale);
config.setLocales(localeList);
} else {
config.setLocale(locale);
}
context.createConfigurationContext(config);
}