Android7.0以上版本如何實(shí)現(xiàn)應(yīng)用內(nèi)語言切換-創(chuàng)新互聯(lián)

小編給大家分享一下Android 7.0以上版本如何實(shí)現(xiàn)應(yīng)用內(nèi)語言切換,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十載品質(zhì),值得信賴!

正文

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

整理了一下線索:

  1. 國外同事的華為手機(jī)出現(xiàn)問題,我身邊朋友的華為手機(jī)沒有問題

  2. 這部分代碼之前一直沒有問題,現(xiàn)在突然出現(xiàn)了問題

  3. 這期間我也看了一下相關(guān)代碼,確實(shí)沒有修改過。但是!我發(fā)現(xiàn)了一個(gè)疑點(diǎn):代碼中使用了一些廢棄的方法和屬性

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

難道是?

我趕緊去問國外的同事,系統(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í)了我的猜想。下圖是我之前使用的方法:

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

廢棄的方法和屬性

可以看到 configuration.locale 屬性和 updateConfiguration 方法都已經(jīng)被打上了廢棄的標(biāo)記。7.0系統(tǒng)推出后告訴開發(fā)者方法已經(jīng)過時(shí),到了8.0系統(tǒng)上這段代碼就已經(jīng)完全不好使了,所以才出現(xiàn)了前面提到的問題。

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

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

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

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

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

首先,我們需要實(shí)現(xiàn)一個(gè)自己的MyContextWrapper,它會根據(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)版本就不會出問題了。

以上是“Android 7.0以上版本如何實(shí)現(xiàn)應(yīng)用內(nèi)語言切換”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:Android7.0以上版本如何實(shí)現(xiàn)應(yīng)用內(nèi)語言切換-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://bm7419.com/article26/ijojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、虛擬主機(jī)軟件開發(fā)、商城網(wǎng)站、網(wǎng)站建設(shè)品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)