自定義控件系列結束了,打個回馬槍,補上前段時間埋下的一個坑---「應用內語言切換」。APP語言改變是一個Configuration,可是這個Configuration和android手機屏幕旋轉有點不大同樣。屏幕旋轉的時候,會destroy當前頁面,並進行從新繪製。而切換語言後不會從新繪製頁面,因此這種狀況的出現形成了網上的只知其一;不知其二小夥伴們哀聲一片,不是在咒罵api的坑爹,就是在賣力的另闢蹊徑想盡辦法解決問題。思路都是很好的,目的也是堅定的,但是方向是錯誤的,把哥哥我也給帶進了坑了,爬了很久才爬出這個深坑。因此今天在此把經驗分享出來,但願之後你們不要和我踩到一個坑裏。android
簡單介紹下這個需求的原因,前段時間因公司業務須要,作了一款即時通信軟件。在這款應用裏面有個設置頁面,其中有一項「語言切換」功能,就是在使用APP的過程當中,動態的去切換APP的語言,具體參照微信設置頁面。起先想來是很簡單的事情嘛,不就是個簡單的資源國際化嘛,strings.xml資源文件一整還不給OK?真正動起手來就真不是這麼一回事了,國際化是沒問題,可是怎樣能更改全部頁面的文字資源呢,這是一個問題。下面介紹下網上找的幾個方案。git
1、API欺騙
燒製到手機中的android.jar包含了Android所需的各類類與方法;而供開發者使用的android.jar只是其中的一部分。API欺騙是指在應用中去模擬未公開的類和方法讓應用編譯經過並生成APK,然而在應用實際運行中調用的卻還是燒製到手機中真實的android.jar。github
2、使用Java反射機制api
IActivityManager與ActivityManagerNative都是非公開類,使用Java反射去調用其中的方法。微信
可是這個弊端是顯而易見的,上述兩種方法都是去更改系統的語言的類型,功能和你去設置頁面去設置語言類型的效果同樣。發現對當前系統設置了新的Locale後,不單本身的應用語系改變了,系統全部的應用語系都改變了。這確定是不合理的。或許你會說,在退出app的時候,大不了再把語言給改回來唄。但是在Android裏面,殺死APP的緣由多種多樣,有內存殺,有用戶強殺,有滑動側滑殺,你又能如何判斷APP是什麼時候被Kill的呢。下面介紹下個人解決方案,實現的效果仍是不錯的。依舊Github代碼地址在最下方,有興趣的同窗能夠去下載看下。app
第一步、使用Android開放的api更改Configuration,同時把語言類型保存下來spa
第二步、Destroy當前頁面,從新繪製才能更改語言類型.net
若是你的頁面不是首頁,你調用上述代碼只會更新當前頁面,壓在棧中的Activity依然不會更新界面。好比微信設置語言成功後,會自動跳轉到首頁,固然首頁的內容也是更新後的,它的實現方式也很簡單,與咱們上面寫的大同小異。就是監聽設置成功後,destroy全部存在的頁面,再跳轉到首頁。這時你的app就能知足了上面的需求了,但是別急還有第三步。orm
第三步、只要你的應用不完全從Dalvik或者ART中完全移除,上述都沒問題。可是若是從新開機,或者強制殺掉應用,再次啓動,就恢復到之前的語言類型了。xml
這會咱們就用到第一步中保存的語言的類型了,在全部頁面的基類BaseActivity中,每次都調用下語言設置的方法,這樣就能把頁面給強制設置成業務需求的語言類型了。OK,這個問題就完滿解決了,要爲你的APP添加這個功能的話,對代碼的改動是很是小的。下面附上代碼地址:https://github.com/JackCho/SwitchLanguageDemo
git地址:https://github.com/JackCho/SwitchLanguageDemo.git
若是以爲對你有所幫助,歡迎你們訂閱個人微信公衆帳號——Android乾貨分享。下面是微信的二維碼,爲你提供及時高質的Android乾貨。