Android 8.0 資源國際化適配

前言

Android 8.0 發(fā)布已經(jīng)有一段時間了笤喳,本文不講新功能,講講資源國際化方面 Android 8.0 的踩坑及填坑經(jīng)歷碌宴。
項目中要求應(yīng)用內(nèi)切換語言杀狡,并且不同語言也對應(yīng)不同的語言字體(參考了這兩個庫 perfectLanguageUpdateNoNeedRestartFontometricsLibrary )贰镣,不同語言對應(yīng)不同的布局文件呜象。


三個部分

  • 切換語言
  • 切換 layout 文件
  • 切換 raw 文件

切換語言

Android 8.0 之前切換語言只需要以下代碼

Resources resources = getContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
config.locale = Locale.ENGLISH; // 應(yīng)用用戶選擇語言
resources.updateConfiguration(config, dm);

Android 8.0 切換語言需要以下代碼

Resources resources = getApplicationContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
config.setLocale(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
      LocaleList localeList = new LocaleList(locale);
      LocaleList.setDefault(localeList);
      config.setLocales(localeList);
      getApplicationContext().createConfigurationContext(config);
}
Locale.setDefault(locale);
resources.updateConfiguration(config, dm);

重點: 確保 applicationContext 代替所有其它類型的 context。(至于針對 Android N 的那幾行代碼碑隆,實測好像沒什么影響恭陡。)


切換 layout 文件

項目需求比較復(fù)雜,我的 layout 文件目錄是這樣的:

image.png

Android 8.0 之前上煤,執(zhí)行了上面代碼休玩,當你切換界面的時候,應(yīng)該能顯示對應(yīng)語言下的 layout 文件劫狠。比如把 Locale 設(shè)置成中文簡體拴疤,R.layout 文件將調(diào)用 layout-zh-rCN 目錄下的界面,但是 Android 8.0 仍然執(zhí)行了默認 layout 目錄下面的界面嘉熊。解決思路仍然是用 applicationContext 替代 context遥赚。
項目里對 layout 文件的使用有兩處:

  • Activity 的 setContentView(R.layout.…)
  • Fragment 的 inflater.inflate(R.layout.…, container, false)
    針對 Fragment 容易解決,我發(fā)現(xiàn) inflate 有兩個重載方法
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {……}
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {……}

其中第二個方法的第一個參數(shù) parser , 可以這樣獲得:getContext().getApplicationContext().getResources().getLayout(R.layout.…), 于是在 fragment 中獲得布局文件就可以這樣寫 inflater.inflate(getContext().getApplicationContext().getResources().getLayout(R.layout.……), container, false);
fragment 的問題解決了阐肤,activitysetContentView確沒有相應(yīng)的方法凫佛。解決方案也很粗暴,就是在 activity 中添加一個充滿全局 fragment孕惜,然后將原 activity 的代碼交由 fragment 管理愧薛,在 fragment 中獲取多資源布局。


切換 raw 文件

為了給不同語言設(shè)置不同字體文件衫画,參考并且修改了 FontometricsLibrary 的代碼毫炉,現(xiàn)在我的 raw 目錄是這樣的:

image.png
raw 轉(zhuǎn)換成 InputStream 代碼如下:

InputStream mInputStream = context.getApplicationContext().getResources().openRawResource(R.raw.…);

重點還是獲得 applicationContext


總結(jié)

在 Android 8.0 國際化的時候,所有需要 context 的地方必須用 applicationContext削罩。

Demo在此

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞄勾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弥激,更是在濱河造成了極大的恐慌进陡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微服,死亡現(xiàn)場離奇詭異趾疚,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門糙麦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛孵,“玉大人,你說我怎么就攤上這事赡磅∑歉浚” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵仆邓,是天一觀的道長鲜滩。 經(jīng)常有香客問我,道長节值,這世上最難降的妖魔是什么徙硅? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮搞疗,結(jié)果婚禮上嗓蘑,老公的妹妹穿的比我還像新娘。我一直安慰自己匿乃,他們只是感情好桩皿,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幢炸,像睡著了一般泄隔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宛徊,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天佛嬉,我揣著相機與錄音,去河邊找鬼闸天。 笑死暖呕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的苞氮。 我是一名探鬼主播湾揽,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笼吟!你這毒婦竟也來了库物?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贷帮,失蹤者是張志新(化名)和其女友劉穎艳狐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皿桑,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诲侮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀虐。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沟绪,靈堂內(nèi)的尸體忽然破棺而出刮便,到底是詐尸還是另有隱情,我是刑警寧澤绽慈,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布恨旱,位于F島的核電站,受9級特大地震影響坝疼,放射性物質(zhì)發(fā)生泄漏搜贤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一钝凶、第九天 我趴在偏房一處隱蔽的房頂上張望仪芒。 院中可真熱鬧,春花似錦耕陷、人聲如沸掂名。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饺蔑。三九已至,卻和暖如春嗜诀,著一層夾襖步出監(jiān)牢的瞬間猾警,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工裹虫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肿嘲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓筑公,卻偏偏與公主長得像雳窟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匣屡,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程封救,因...
    小菜c閱讀 6,444評論 0 17
  • 我不是你的蝴蝶 不知道你將要的飛行方向 我不是你的大海 不知道你內(nèi)心的波濤洶涌 我不是你的小說 不知道你瞎編的狗血...
    一杯愛喝的奶茶閱讀 149評論 0 0
  • 一奇跡 1.今天我信任宇宙頭腦機智靈活轉(zhuǎn)身回到和平的家,祥和寧靜充滿著我安寧感是我的太完美太完美了捣作。 2.今天很亨...
    和平感恩閱讀 168評論 0 0
  • 幾分離愁 不多言語 枉佳人昔日紅樓何曾忘 蓬頭春意 繁花似錦 竊歸君策馬渡橋心之切 微笑再美再甜不是你的...
    Summeringever閱讀 104評論 0 0