Android應用內語言切換實現

自定義控件系列結束了,打個回馬槍,補上前段時間埋下的一個坑---“應用內語言切換”。APP語言改變是一個Configuration,但是這個Configuration和android手機屏幕旋轉有點不大一樣。屏幕旋轉的時候,會destroy當前頁面,並進行重新繪製。而切換語言後不會重新繪製頁面,所以這種情況的出現造成了網上的一知半解小夥伴們哀聲一片,不是在咒罵api的坑爹,就是在賣力的另闢蹊徑想盡辦法解決問題。思路都是很好的,目的也是堅決的,可是方向是錯誤的,把哥哥我也給帶進了坑了,爬了好久才爬出這個深坑。所以今天在此把經驗分享出來,希望以後大家不要和我踩到一個坑裏。

簡單介紹下這個需求的緣由,前段時間因公司業務需要,做了一款即時通訊軟件。在這款應用裏面有個設置頁面,其中有一項“語言切換”功能,就是在使用APP的過程中,動態的去切換APP的語言,具體參照微信設置頁面。起先想來是很簡單的事情嘛,不就是個簡單的資源國際化嘛,strings.xml資源文件一整還不給OK?真正動起手來就真不是這麼一回事了,國際化是沒問題,但是怎樣能更改所有頁面的文字資源呢,這是一個問題。下面介紹下網上找的幾個方案。

一、API欺騙
    燒製到手機中的android.jar包含了Android所需的各種類與方法;而供開發者使用的android.jar只是其中的一部分。API欺騙是指在應用中去模擬未公開的類和方法讓應用編譯通過並生成APK,然而在應用實際運行中調用的卻仍是燒製到手機中真實的android.jar。

二、使用Java反射機制

    IActivityManager與ActivityManagerNative都是非公開類,使用Java反射去調用其中的方法。


但是這個弊端是顯而易見的,上述兩種方法都是去更改系統的語言的類型,功能和你去設置頁面去設置語言類型的效果一樣。發現對當前系統設置了新的Locale後,不單自己的應用語系改變了,系統所有的應用語系都改變了。這肯定是不合理的。或許你會說,在退出app的時候,大不了再把語言給改回來唄。可是在Android裏面,殺死APP的原因多種多樣,有內存殺,有用戶強殺,有滑動側滑殺,你又能如何判斷APP是何時被Kill的呢。下面介紹下我的解決方案,實現的效果還是不錯的。依舊Github代碼地址在最下方,有興趣的同學可以去下載看下。

第一步、使用Android開放的api更改Configuration,同時把語言類型保存下來

第二步、Destroy當前頁面,重新繪製才能更改語言類型

如果你的頁面不是首頁,你調用上述代碼只會更新當前頁面,壓在棧中的Activity依然不會更新界面。比如微信設置語言成功後,會自動跳轉到首頁,當然首頁的內容也是更新後的,它的實現方式也很簡單,與我們上面寫的大同小異。就是監聽設置成功後,destroy所有存在的頁面,再跳轉到首頁。這時你的app就能滿足了上面的需求了,可是別急還有第三步。

第三步、只要你的應用不徹底從Dalvik或者ART中徹底移除,上述都沒問題。但是如果重新開機,或者強制殺掉應用,再次啓動,就恢復到以前的語言類型了。

這會我們就用到第一步中保存的語言的類型了,在所有頁面的基類BaseActivity中,每次都調用下語言設置的方法,這樣就能把頁面給強制設置成業務需求的語言類型了。OK,這個問題就完滿解決了,要爲你的APP添加這個功能的話,對代碼的改動是非常小的。下面附上代碼地址:https://github.com/JackCho/SwitchLanguageDemo

git地址:https://github.com/JackCho/SwitchLanguageDemo.git

如果覺得對你有所幫助,歡迎大家訂閱我的微信公衆賬號——Android乾貨分享。下面是微信的二維碼,爲你提供及時高質的Android乾貨。技術交流QQ羣:318588906,歡迎大家加羣,共同探討下Android和Java技術,一起壯大我們的微信乾貨分享社區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章