1.當(dāng)APP第一次打開時勒奇,如果默認(rèn)語言和手機語言不一致北滥,則需要先在Application的onCreate中調(diào)用使用語言
@Override
public void onCreate() {
super.onCreate();
...
//設(shè)置APP語言
if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都沒有設(shè)置盔腔,則需要默認(rèn)設(shè)置一次壕曼,以便Activity中生效
//這里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
//LanguageUtils.applyLanguage(locale);
//由于上面這個方法會造成閃屏昼扛,所以將內(nèi)部方法提取為下面的寫法
SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
}
...
}
2.調(diào)用LanguageUtils.updateAppContextLanguage更新Application的語言
@Override
public void onCreate() {
super.onCreate();
...
//修改Application的語言
LanguageUtils.updateAppContextLanguage(locale, null);
...
}
3.修復(fù)StringUtils獲取string的語言
@Override
public void onCreate() {
super.onCreate();
...
//修復(fù)StringUtils獲取string的語言
LanguageUtil.applyLanguage(this, this.getResources(), locale);
...
4.由于LanguageUtils中的語言更新并沒有更新到Resources.getSystem()中的語言寸齐,所以以防萬一,我們再更新一下Resources.getSystem()中的語言抄谐,代碼可以參考LanguageUtils中的更新方法
@Override
public void onCreate() {
super.onCreate();
...
if (ProcessUtils.isMainProcess()) {
//修復(fù)WebView導(dǎo)致的語言切換失效渺鹦,要放到設(shè)置語言前
new WebView(this).destroy();
//當(dāng)前語言
Locale locale = LanguageUtil.getCurrentLanguageLocale();
//設(shè)置APP語言
if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都沒有設(shè)置,則需要默認(rèn)設(shè)置一次蛹含,以便Activity中生效
//這里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
//LanguageUtils.applyLanguage(locale);
//由于上面這個方法會造成閃屏毅厚,所以將內(nèi)部方法提取為下面的寫法
SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
}
//修改Application的語言
LanguageUtils.updateAppContextLanguage(locale, null);
//修改Resources.getSystem()的語言
LanguageUtil.applyLanguage(this, Resources.getSystem(), locale);
//修復(fù)StringUtils獲取string的語言
LanguageUtil.applyLanguage(this, this.getResources(), locale);
...
}
}
部分調(diào)用方法:
//獲取當(dāng)前語言
public static Locale getCurrentLanguageLocale() {
Locale locale = LanguageUtils.getAppliedLanguage();
if (locale == null) {
return Locale.US;
} else {
return locale;
}
}
//設(shè)置當(dāng)前語言
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);
}