Android 7.0以上版本實(shí)現(xiàn)應(yīng)用內(nèi)語言切換的方法
前言
項(xiàng)目里有個(gè)功能,在應(yīng)用內(nèi)切換語言,之前上線了大半年,一直都是正常運(yùn)行,但是最近這次發(fā)版以后,在國外的同事反饋(這里面還包括CEO... 尷尬),他們的華為手機(jī)上出現(xiàn)了中英文混亂的問題。本文記錄了解決問題的過程和方法。
正文
首先這部分功能的代碼是之前已經(jīng)離職的同事留下的,一直跑得好好的,我也沒去動(dòng)過,發(fā)版前用別的手機(jī)測試也沒有出現(xiàn)問題,怎么突然就出現(xiàn)中英文混亂了呢?難道是華為的鍋?國外同事的手機(jī)沒法拿來調(diào)試,聽說他們也都是在國內(nèi)買了帶到國外去的,后來我也在身邊找了幾個(gè)華為手機(jī)試了一下,并沒有出現(xiàn)問題,我陷入了沉思...
整理了一下線索:
- 國外同事的華為手機(jī)出現(xiàn)問題,我身邊朋友的華為手機(jī)沒有問題
- 這部分代碼之前一直沒有問題,現(xiàn)在突然出現(xiàn)了問題
- 這期間我也看了一下相關(guān)代碼,確實(shí)沒有修改過。但是!我發(fā)現(xiàn)了一個(gè)疑點(diǎn):代碼中使用了一些廢棄的方法和屬性
難道是?
我趕緊去問國外的同事,系統(tǒng)版本是多少,果然不出所料,國外同事的系統(tǒng)版本已經(jīng)更新到了最新的8.0版本。這下一切都說得通了,華為是國內(nèi)最早升級8.0系統(tǒng)的廠商,升級的策略一般是先從旗艦機(jī)開始,逐步向下輻射,而當(dāng)下正值部分高端機(jī)型已經(jīng)升級到了8.0系統(tǒng),而中低端機(jī)型還沒有開始推送的時(shí)間節(jié)點(diǎn)。很有可能問題就出在那幾個(gè)廢棄的方法和屬性上。
在網(wǎng)上查找了相關(guān)資料后,證實(shí)了我的猜想。下圖是我之前使用的方法:
廢棄的方法和屬性
可以看到 configuration.locale 屬性和 updateConfiguration 方法都已經(jīng)被打上了廢棄的標(biāo)記。7.0系統(tǒng)推出后告訴開發(fā)者方法已經(jīng)過時(shí),到了8.0系統(tǒng)上這段代碼就已經(jīng)完全不好使了,所以才出現(xiàn)了前面提到的問題。
那么為什么Google會(huì)廢棄這段代碼呢?其實(shí)原因很明顯,在7.0系統(tǒng)以后,我們的系統(tǒng)語言選擇已經(jīng)不再是設(shè)置一種語言,而是可以設(shè)置一組語言:
7.0版本后的語言設(shè)置界面
Google把語言這一塊進(jìn)行了較大的調(diào)整,系統(tǒng)會(huì)根據(jù)這個(gè)列表的優(yōu)先級去適配語言。機(jī)制都變了,以前的代碼當(dāng)然會(huì)廢棄掉了。
既然我們已經(jīng)找到了問題的原因,那么如何去解決呢?
首先,我們需要實(shí)現(xiàn)一個(gè)自己的MyContextWrapper,它會(huì)根據(jù)不同的系統(tǒng)版本采用相應(yīng)方法來設(shè)置 Locale 或者 LocaleList ,并且返回一個(gè)ContextWrapper:
public class MyContextWrapper extends android.content.ContextWrapper { public MyContextWrapper(Context base) { super(base); } public static ContextWrapper wrap(Context context, Locale newLocale) { Resources res = context.getResources(); Configuration configuration = res.getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { configuration.setLocale(newLocale); LocaleList localeList = new LocaleList(newLocale); LocaleList.setDefault(localeList); configuration.setLocales(localeList); context = context.createConfigurationContext(configuration); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { configuration.setLocale(newLocale); context = context.createConfigurationContext(configuration); } return new ContextWrapper(context); } }
接下來,我們只需要在我們的 BaseActivity 里重寫 attachBaseContext() 方法即可,代碼如下:
@Override protected void attachBaseContext(Context newBase) { Locale newLocale; // .. create or get your new Locale object here. Context context = MyContextWrapper.wrap(newBase, newLocale); super.attachBaseContext(context); }
大功告成,這樣在7.0及以上系統(tǒng)版本就不會(huì)出問題了。
結(jié)語
說實(shí)話,這還是我第一次遇到廢棄的方法就真的不好使了。以前參與過的項(xiàng)目里或多或少都有一些過時(shí)的屬性、方法,但是它們都頑強(qiáng)地肩負(fù)著自己的使命,看起來好像永遠(yuǎn)不會(huì)真的被廢棄...
經(jīng)過這一次,讓我吸取了教訓(xùn),廢棄的方法和屬性最好盡早替換掉,它雖然現(xiàn)在沒有問題,但是保不齊哪天就不好使了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)app應(yīng)用多語言切換功能
- Android app應(yīng)用多語言切換功能實(shí)現(xiàn)
- android動(dòng)態(tài)設(shè)置app當(dāng)前運(yùn)行語言的方法
- 詳解Android更改APP語言模式的實(shí)現(xiàn)過程
- android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語言(中日英切換)
- Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置實(shí)例代碼
- Android實(shí)現(xiàn)應(yīng)用內(nèi)置語言切換功能
- Android實(shí)現(xiàn)系統(tǒng)語言切換功能
- Android App中進(jìn)行語言的切換
相關(guān)文章
詳解Android TableLayout中stretchColumns、shrinkColumns的用法
這篇文章主要介紹了Android TableLayout中stretchColumns、shrinkColumns用法的相關(guān)資料,需要的朋友可以參考下2017-03-03Android自定義滑動(dòng)驗(yàn)證條的示例代碼
本篇文章主要介紹了Android自定義滑動(dòng)驗(yàn)證條的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08kotlin中數(shù)據(jù)類重寫setter getter的正確方法
這篇文章主要給大家介紹了關(guān)于kotlin中數(shù)據(jù)類重寫setter getter的正確方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Android自定義view實(shí)現(xiàn)圓形waveview
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)圓形waveview,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android WebView自定義長按選擇實(shí)現(xiàn)收藏/分享選中文本功能
這篇文章主要介紹了Android WebView自定義長按選擇實(shí)現(xiàn)收藏/分享選中文本功能,需要的朋友可以參考下2017-06-06RecyclerView實(shí)現(xiàn)橫向滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)橫向滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01詳解Flutter中StatefulBuilder組件的使用
StatefulBuilder小部件可以在這些區(qū)域的狀態(tài)發(fā)生變化時(shí)僅重建某些小區(qū)域而無需付出太多努力。本文將來詳細(xì)講講它的使用,需要的可以參考一下2022-05-05Android?中?FrameLayout?布局及屬性的使用詳解
這篇文章主要介紹了Android?中?FrameLayout?布局及屬性的使用,FrameLayout?在實(shí)現(xiàn)簡單布局時(shí)非常方便,特別適用于疊加式布局,如顯示疊加的圖層或浮動(dòng)按鈕等,需要的朋友可以參考下2024-03-03Android實(shí)現(xiàn)微信首頁左右滑動(dòng)切換效果
這篇文章主要介紹了Android實(shí)現(xiàn)微信首頁左右滑動(dòng)切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09