小編給大家分享一下Android 7.0以上版本如何實現應用內語言切換,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
正文
首先這部分功能的代碼是之前已經離職的同事留下的,一直跑得好好的,我也沒去動過,發版前用別的手機測試也沒有出現問題,怎么突然就出現中英文混亂了呢?難道是華為的鍋?國外同事的手機沒法拿來調試,聽說他們也都是在國內買了帶到國外去的,后來我也在身邊找了幾個華為手機試了一下,并沒有出現問題,我陷入了沉思...
整理了一下線索:
國外同事的華為手機出現問題,我身邊朋友的華為手機沒有問題
這部分代碼之前一直沒有問題,現在突然出現了問題
這期間我也看了一下相關代碼,確實沒有修改過。但是!我發現了一個疑點:代碼中使用了一些廢棄的方法和屬性
難道是?
我趕緊去問國外的同事,系統版本是多少,果然不出所料,國外同事的系統版本已經更新到了最新的8.0版本。這下一切都說得通了,華為是國內最早升級8.0系統的廠商,升級的策略一般是先從旗艦機開始,逐步向下輻射,而當下正值部分高端機型已經升級到了8.0系統,而中低端機型還沒有開始推送的時間節點。很有可能問題就出在那幾個廢棄的方法和屬性上。
在網上查找了相關資料后,證實了我的猜想。下圖是我之前使用的方法:
廢棄的方法和屬性
可以看到 configuration.locale 屬性和 updateConfiguration 方法都已經被打上了廢棄的標記。7.0系統推出后告訴開發者方法已經過時,到了8.0系統上這段代碼就已經完全不好使了,所以才出現了前面提到的問題。
那么為什么Google會廢棄這段代碼呢?其實原因很明顯,在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及以上系統版本就不會出問題了。
以上是“Android 7.0以上版本如何實現應用內語言切換”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。