国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 7.0以上版本實現應用內語言切換的方法

2019-10-22 18:15:40
字體:
來源:轉載
供稿:網友

前言

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

正文

首先這部分功能的代碼是之前已經離職的同事留下的,一直跑得好好的,我也沒去動過,發版前用別的手機測試也沒有出現問題,怎么突然就出現中英文混亂了呢?難道是華為的鍋?國外同事的手機沒法拿來調試,聽說他們也都是在國內買了帶到國外去的,后來我也在身邊找了幾個華為手機試了一下,并沒有出現問題,我陷入了沉思...

整理了一下線索:

  1. 國外同事的華為手機出現問題,我身邊朋友的華為手機沒有問題
  2. 這部分代碼之前一直沒有問題,現在突然出現了問題
  3. 這期間我也看了一下相關代碼,確實沒有修改過。但是!我發現了一個疑點:代碼中使用了一些廢棄的方法和屬性

Android,7.0,內語言切換,7.0應用內語言切換

難道是?

我趕緊去問國外的同事,系統版本是多少,果然不出所料,國外同事的系統版本已經更新到了最新的8.0版本。這下一切都說得通了,華為是國內最早升級8.0系統的廠商,升級的策略一般是先從旗艦機開始,逐步向下輻射,而當下正值部分高端機型已經升級到了8.0系統,而中低端機型還沒有開始推送的時間節點。很有可能問題就出在那幾個廢棄的方法和屬性上。

在網上查找了相關資料后,證實了我的猜想。下圖是我之前使用的方法:

Android,7.0,內語言切換,7.0應用內語言切換

廢棄的方法和屬性

可以看到 configuration.locale 屬性和 updateConfiguration 方法都已經被打上了廢棄的標記。7.0系統推出后告訴開發者方法已經過時,到了8.0系統上這段代碼就已經完全不好使了,所以才出現了前面提到的問題。

那么為什么Google會廢棄這段代碼呢?其實原因很明顯,在7.0系統以后,我們的系統語言選擇已經不再是設置一種語言,而是可以設置一組語言:

Android,7.0,內語言切換,7.0應用內語言切換

7.0版本后的語言設置界面

Google把語言這一塊進行了較大的調整,系統會根據這個列表的優先級去適配語言。機制都變了,以前的代碼當然會廢棄掉了。

既然我們已經找到了問題的原因,那么如何去解決呢?

首先,我們需要實現一個自己的MyContextWrapper,它會根據不同的系統版本采用相應方法來設置 Locale 或者 LocaleList ,并且返回一個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及以上系統版本就不會出問題了。

結語

說實話,這還是我第一次遇到廢棄的方法就真的不好使了。以前參與過的項目里或多或少都有一些過時的屬性、方法,但是它們都頑強地肩負著自己的使命,看起來好像永遠不會真的被廢棄...

經過這一次,讓我吸取了教訓,廢棄的方法和屬性最好盡早替換掉,它雖然現在沒有問題,但是保不齊哪天就不好使了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淳安县| 漠河县| 新宁县| 屏东市| 交口县| 仪陇县| 凤凰县| 襄垣县| 泰安市| 九龙县| 富锦市| 嘉善县| 即墨市| 荣昌县| 天柱县| 德格县| 临清市| 普陀区| 铜山县| 金沙县| 迁西县| 自治县| 苗栗县| 潜山县| 泗洪县| 合肥市| 宜章县| 平凉市| 乳源| 涞源县| 休宁县| 丰县| 出国| 万源市| 永康市| 开原市| 南丰县| 新邵县| 醴陵市| 波密县| 新源县|