Android面試一天一題(12 Day)

昨天組里的同事遇到一些切換多語言的細(xì)節(jié)問題寒锚,發(fā)現(xiàn)在Android N版本上配置應(yīng)用內(nèi)多語言沒有生效,正好拿出來做為一個面試題講解一下。

面試題:如何實現(xiàn)應(yīng)用內(nèi)多語言切換呵哨?

我們知道Android的多語言實現(xiàn)很簡單叽讳,可以在不同的語言環(huán)境下使用不同的資源横殴。在不同的res/value-xx下放置不同語言的strings.xml實現(xiàn)字符的本地化,而這個value-xx目錄的選擇是根據(jù)Resource中的Configuration.Locale這項的值來決定的。如zh中文硅堆,就會選擇value-zh目錄,如果沒有匹配到(即APK中沒有value-zh目錄)就使用默認(rèn)的value目錄中的字符資源纯丸。

其實最終實現(xiàn)字符串的選擇都是在Assets這個類中剃氧,通過Native的方法來加載相應(yīng)的字符串資源。

然而谎柄,我們還是會有一些業(yè)務(wù)場景需要不根據(jù)Android系統(tǒng)的Locale配置就改變應(yīng)用的語言丁侄。實現(xiàn)的方式也很簡單,直接調(diào)用Android開放的接口Resources.updateConfiguration:

    public static void changeSystemLanguage(Context context, String language) {
        if (context == null || TextUtils.isEmpty(language)) {
            return;
        }

        Resources resources = context.getResources();
        Configuration config = resources.getConfiguration();
        if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) {
            config.locale = Locale.SIMPLIFIED_CHINESE;
        } else {
            config.locale = new Locale(language);
        }
        resources.updateConfiguration(config, null);
    }

上面的代碼朝巫,我們可以在應(yīng)用內(nèi)通過language的值指定是顯示哪種語言鸿摇,當(dāng)然language值我們需要保存在Preferences或者數(shù)據(jù)庫中。

好像很簡單劈猿,我們的項目為什么還會出現(xiàn)問題呢户辱?而且大家都不知道如何下手,因為在Android N之前的版本都是可以正常切換語言的糙臼。后來我跟了一下庐镐,發(fā)現(xiàn)在MainActivity和SplashActivity這些Activity有繼承了自已擴展的BaseActivity,而這個BaseActivity有這樣一段代碼:

    @Override
    public Resources getResources() {
        Resources res = super.getResources();
        Configuration config = new Configuration();
        config.setToDefaults();
        res.updateConfiguration(config, res.getDisplayMetrics());
        return res;
    }

config.setToDefaults會將Locale的值設(shè)為null变逃,而再調(diào)用updateConfiguration可能會根據(jù)Android系統(tǒng)的語言重新設(shè)置Resources中的Locale必逆。好吧,只是假設(shè)揽乱,還沒有看到Android N的源代碼名眉。不過去掉這段代碼后,在Android N(Preview)手機上切換語言正常了凰棉。

小結(jié)

今天遇到的問題损拢,是以前遺留的代碼埋下的坑終于暴露出來,也是這個項目缺乏代碼審查(Code Review)機制的結(jié)果撒犀。找了幾個人也無法說清覆寫getResources這個方法的用意福压,最終也只能按歷史問題處理了,是歷史總有一些說不清楚的事或舞,對吧荆姆。

回到這個面試題,現(xiàn)在你知道了可以在應(yīng)用內(nèi)切換語言(當(dāng)然也可以修改Configuration的其他值)映凳,那么你有沒有想過胆筒,如果不知道這個updateConfiguration的存在,你會怎么實現(xiàn)這個需求呢诈豌?或者說沒有人和你說過updateConfiguration仆救,你能找到它嗎抒和?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彤蔽,隨后出現(xiàn)的幾起案子构诚,更是在濱河造成了極大的恐慌,老刑警劉巖铆惑,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件范嘱,死亡現(xiàn)場離奇詭異,居然都是意外死亡员魏,警方通過查閱死者的電腦和手機丑蛤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撕阎,“玉大人受裹,你說我怎么就攤上這事÷彩” “怎么了棉饶?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镇匀。 經(jīng)常有香客問我照藻,道長,這世上最難降的妖魔是什么汗侵? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任幸缕,我火速辦了婚禮,結(jié)果婚禮上晰韵,老公的妹妹穿的比我還像新娘发乔。我一直安慰自己,他們只是感情好雪猪,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布栏尚。 她就那樣靜靜地躺著,像睡著了一般只恨。 火紅的嫁衣襯著肌膚如雪译仗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天坤次,我揣著相機與錄音古劲,去河邊找鬼。 笑死缰猴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疤剑。 我是一名探鬼主播滑绒,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼闷堡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疑故?” 一聲冷哼從身側(cè)響起杠览,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纵势,沒想到半個月后踱阿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钦铁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年软舌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牛曹。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡佛点,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黎比,到底是詐尸還是另有隱情超营,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布阅虫,位于F島的核電站演闭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颓帝。R本人自食惡果不足惜船响,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躲履。 院中可真熱鬧见间,春花似錦、人聲如沸工猜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篷帅。三九已至史侣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魏身,已是汗流浹背惊橱。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箭昵,地道東北人税朴。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親正林。 傳聞我的和親對象是個殘疾皇子泡一,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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