Android 7.0以上版本,如何實(shí)現(xiàn)應(yīng)用內(nèi)語(yǔ)言切換

前言

項(xiàng)目里有個(gè)功能,在應(yīng)用內(nèi)切換語(yǔ)言,之前上線了大半年,一直都是正常運(yùn)行,但是最近這次發(fā)版以后,在國(guó)外的同事反饋(這里面還包括CEO... 尷尬),他們的華為手機(jī)上出現(xiàn)了中英文混亂的問(wèn)題。本文記錄了解決問(wèn)題的過(guò)程和方法。

正文

首先這部分功能的代碼是之前已經(jīng)離職的同事留下的,一直跑得好好的,我也沒(méi)去動(dòng)過(guò),發(fā)版前用別的手機(jī)測(cè)試也沒(méi)有出現(xiàn)問(wèn)題,怎么突然就出現(xiàn)中英文混亂了呢?難道是華為的鍋?國(guó)外同事的手機(jī)沒(méi)法拿來(lái)調(diào)試,聽(tīng)說(shuō)他們也都是在國(guó)內(nèi)買了帶到國(guó)外去的,后來(lái)我也在身邊找了幾個(gè)華為手機(jī)試了一下,并沒(méi)有出現(xiàn)問(wèn)題,我陷入了沉思...

整理了一下線索:

  • 國(guó)外同事的華為手機(jī)出現(xiàn)問(wèn)題,我身邊朋友的華為手機(jī)沒(méi)有問(wèn)題
  • 這部分代碼之前一直沒(méi)有問(wèn)題,現(xiàn)在突然出現(xiàn)了問(wèn)題
  • 這期間我也看了一下相關(guān)代碼,確實(shí)沒(méi)有修改過(guò)。但是!我發(fā)現(xiàn)了一個(gè)疑點(diǎn):代碼中使用了一些廢棄的方法和屬性
難道是?

我趕緊去問(wèn)國(guó)外的同事,系統(tǒng)版本是多少,果然不出所料,國(guó)外同事的系統(tǒng)版本已經(jīng)更新到了最新的8.0版本。這下一切都說(shuō)得通了,華為是國(guó)內(nèi)最早升級(jí)8.0系統(tǒng)的廠商,升級(jí)的策略一般是先從旗艦機(jī)開(kāi)始,逐步向下輻射,而當(dāng)下正值部分高端機(jī)型已經(jīng)升級(jí)到了8.0系統(tǒng),而中低端機(jī)型還沒(méi)有開(kāi)始推送的時(shí)間節(jié)點(diǎn)。很有可能問(wèn)題就出在那幾個(gè)廢棄的方法和屬性上。

在網(wǎng)上查找了相關(guān)資料后,證實(shí)了我的猜想。下圖是我之前使用的方法:


廢棄的方法和屬性

可以看到 configuration.locale 屬性和 updateConfiguration 方法都已經(jīng)被打上了廢棄的標(biāo)記。7.0系統(tǒng)推出后告訴開(kāi)發(fā)者方法已經(jīng)過(guò)時(shí),到了8.0系統(tǒng)上這段代碼就已經(jīng)完全不好使了,所以才出現(xiàn)了前面提到的問(wèn)題。
那么為什么Google會(huì)廢棄這段代碼呢?其實(shí)原因很明顯,在7.0系統(tǒng)以后,我們的系統(tǒng)語(yǔ)言選擇已經(jīng)不再是設(shè)置一種語(yǔ)言,而是可以設(shè)置一組語(yǔ)言:


7.0版本后的語(yǔ)言設(shè)置界面

Google把語(yǔ)言這一塊進(jìn)行了較大的調(diào)整,系統(tǒng)會(huì)根據(jù)這個(gè)列表的優(yōu)先級(jí)去適配語(yǔ)言。機(jī)制都變了,以前的代碼當(dāng)然會(huì)廢棄掉了。

既然我們已經(jīng)找到了問(wèn)題的原因,那么如何去解決呢?

首先,我們需要實(shí)現(xiàn)一個(gè)自己的MyContextWrapper,它會(huì)根據(jù)不同的系統(tǒng)版本采用相應(yīng)方法來(lái)設(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);
    }
}

接下來(lái),我們只需要在我們的 BaseActivity 里重寫(xiě) 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ì)出問(wèn)題了。

結(jié)語(yǔ)

說(shuō)實(shí)話,這還是我第一次遇到廢棄的方法就真的不好使了。以前參與過(guò)的項(xiàng)目里或多或少都有一些過(guò)時(shí)的屬性、方法,但是它們都頑強(qiáng)地肩負(fù)著自己的使命,看起來(lái)好像永遠(yuǎn)不會(huì)真的被廢棄...
經(jīng)過(guò)這一次,讓我吸取了教訓(xùn),廢棄的方法和屬性最好盡早替換掉,它雖然現(xiàn)在沒(méi)有問(wèn)題,但是保不齊哪天就不好使了。

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 網(wǎng)上曾看到一位老師無(wú)奈的發(fā)出感慨:學(xué)校教育不是萬(wàn)能的,家長(zhǎng)大人,請(qǐng)?jiān)徖蠋煹木欧N登天之難! 1、你常對(duì)孩子拳打腳踢...
    童心媽咪閱讀 944評(píng)論 1 3
  • 親子日記第20天,八天長(zhǎng)假結(jié)束,孫韶涵用一天的時(shí)間寫(xiě)完作業(yè),然后就回老家了!瘋玩了七天,今天第一天上學(xué),早晨剛到學(xué)...
    三年級(jí)三班孫韶涵閱讀 192評(píng)論 0 0
  • 莫提默·J.艾德勒(1902-2001)以學(xué)者、教育家、編輯人等多重面貌享有盛名。除了寫(xiě)作《如何閱讀一本書(shū)》外,以...
    一半記住了閱讀 924評(píng)論 3 20

友情鏈接更多精彩內(nèi)容