Android多語言切換完美解決方案(兼容7.0以上版本)

Android多語言切換完美解決方案

最近公司開始做多語言版本,由于之前沒有做過鲫趁,所以在網(wǎng)上搜尋了一番這方面的資料,最后經(jīng)過實(shí)踐土陪、總結(jié)俘陷,寫下了這篇文章。源碼Github

多語言的切換功能

首先钥平,實(shí)現(xiàn)多語言的切換功能,參考Android App 多語言切換

1.在res資源文件目錄下添加不同語言的values,如圖:

添加多語言.png

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

簡書地址:http://www.reibang.com/p/16efe98d4554/)

E-mail:931675174@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傅瞻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盲憎,更是在濱河造成了極大的恐慌嗅骄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饼疙,死亡現(xiàn)場離奇詭異溺森,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門屏积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來医窿,“玉大人,你說我怎么就攤上這事炊林±崖” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵渣聚,是天一觀的道長独榴。 經(jīng)常有香客問我,道長奕枝,這世上最難降的妖魔是什么括眠? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮倍权,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捞烟。我一直安慰自己薄声,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布题画。 她就那樣靜靜地躺著默辨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苍息。 梳的紋絲不亂的頭發(fā)上缩幸,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音竞思,去河邊找鬼表谊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盖喷,可吹牛的內(nèi)容都是我干的爆办。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼课梳,長吁一口氣:“原來是場噩夢啊……” “哼距辆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暮刃,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤跨算,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后椭懊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诸蚕,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挫望。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立润。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖媳板,靈堂內(nèi)的尸體忽然破棺而出桑腮,到底是詐尸還是另有隱情,我是刑警寧澤蛉幸,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布破讨,位于F島的核電站,受9級特大地震影響奕纫,放射性物質(zhì)發(fā)生泄漏提陶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一匹层、第九天 我趴在偏房一處隱蔽的房頂上張望隙笆。 院中可真熱鬧,春花似錦升筏、人聲如沸撑柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铅忿。三九已至,卻和暖如春灵汪,著一層夾襖步出監(jiān)牢的瞬間檀训,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工享言, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留峻凫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓览露,卻偏偏與公主長得像蔚晨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子肛循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容