Android多語言切換完美解決方案
最近公司開始做多語言版本,由于之前沒有做過鲫趁,所以在網(wǎng)上搜尋了一番這方面的資料,最后經(jīng)過實(shí)踐土陪、總結(jié)俘陷,寫下了這篇文章。源碼Github
多語言的切換功能
首先钥平,實(shí)現(xiàn)多語言的切換功能,參考Android App 多語言切換。
1.在res資源文件目錄下添加不同語言的values,如圖:
2.通過修改Configuration中的locale來實(shí)現(xiàn)app語言的切換涉瘾,具體代碼如下:
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
resources.updateConfiguration(config, dm);
3.根據(jù)本地緩存的type獲取對應(yīng)的locale,其中7.0以上的系統(tǒng)需要另做處理知态,具體代碼如下:
Locale locale;
// 應(yīng)用用戶選擇語言
switch (type) {
case 0:
//由于API僅支持7.0,需要判斷立叛,否則程序會(huì)crash(解決7.0以上系統(tǒng)不能跟隨系統(tǒng)語言問題)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList localeList = LocaleList.getDefault();
locale = localeList.get(localeList.size() - 1);
} else {
locale = Locale.getDefault();
}
break;
负敏、、秘蛇、
default:
locale = thLocale;
break;
}
4.在AppApplication中初始化時(shí)設(shè)置本地語言其做,用于每次啟動(dòng)APP后切換到本地緩存的語言
// 設(shè)置本地化語言
I18NUtils.setLocale(this);
5.在BaseActivity的OnCreate()方法中設(shè)置語言,用于處理每次切換系統(tǒng)語言后app語言會(huì)跟隨系統(tǒng)變化的問題
if(!I18NUtils.isSameLanguage(this)) {
I18NUtils.setLocale(this);
I18NUtils.toRestartMainActvity(this);
}
6.手動(dòng)切換語言時(shí)赁还,先更新locale配置妖泄,然后通過跳轉(zhuǎn)到主Activity實(shí)現(xiàn)。Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK通過清理掉進(jìn)程中的所有activity重新配置艘策。
Intent intent = new Intent(activity, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.startActivity(intent);
// 殺掉進(jìn)程蹈胡,如果是跨進(jìn)程則殺掉當(dāng)前進(jìn)程
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(0);
解決7.0以上系統(tǒng)存在的兼容問題
這個(gè)問題的解決參考了Android 7.0 語言設(shè)置爬坑。由于Android7.0以上Configuration將通過LocaleList來管理語言朋蔫,并且系統(tǒng)切換語言后罚渐,系統(tǒng)默認(rèn)語言可能并不在LocaleList頂部官方API說明
進(jìn)測試得出結(jié)論,如果APP手動(dòng)選擇過語言則系統(tǒng)語言是第二個(gè)驯妄,否則是第一個(gè)荷并。獲取當(dāng)前系統(tǒng)locale,代碼如下:
//由于API僅支持7.0,需要判斷富玷,否則程序會(huì)crash(解決7.0以上系統(tǒng)不能跟隨系統(tǒng)語言問題)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList localeList = LocaleList.getDefault();
int spType = getLanguageType(AppApplication.getAppContext());
// 如果app已選擇不跟隨系統(tǒng)語言璧坟,則取第二個(gè)數(shù)據(jù)為系統(tǒng)默認(rèn)語言
if(spType != 0 && localeList.size() > 1) {
locale = localeList.get(1);
} else {
locale = localeList.get(0);
}
} else {
locale = Locale.getDefault();
}
7.0以上系統(tǒng)WebView所在Activity沒有跟隨語言切換問題
更新日期:2017年12月14日15:56:47
在后續(xù)的測試發(fā)現(xiàn),在有webView的activitiy中語言并沒有隨著語言進(jìn)行切換赎懦。參考多語言切換失效的問題以及stackoverflow后雀鹃,通過在切換語言之前執(zhí)行new WebView(context).destroy()解決。代碼:
// 解決webview所在的activity語言沒有切換問題
new WebView(context).destroy();
// 切換語言
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
config.locale = getLocaleByType(type);
LogUtils.logd("setLocale: " + config.locale.toString());
resources.updateConfiguration(config, dm);
總結(jié)
自此励两,多語言切換的問題已經(jīng)完美解決了黎茎。經(jīng)測試,完全兼容7.0以上系統(tǒng)的多語言切換当悔。具體代碼我已上傳至Github