Android應用內部切換語言

Android 應用 內部切換語言的需求其實挺多的,比如支付寶,微信等。

實現代碼

其實這個代碼網上一搜就出來了

public class LanguageUtils{
    public void setLanguage(Context context, String lan){
        Resources res = context.getResources();
        Locale current = new Locale(lan);
        Configuration conf = res.getConfiguration();
        conf.locale = current;
        res.updateConfiguration(conf, res.getDisplayMetrics());
    }
}

當用戶在界面上更改語言後會調用此方法進行變更語言。當然你可以保存起來,以便下次啓動時恢復。

問題

  1. 應用在使用過程中可能恢復“設置”中本地語言的界面
    出現此問題的原因參考Android源碼分析-資源加載機制此博文,引用如下片段

根據上述代碼中資源的請求機制,再加上ResourcesManager採用單例模式,這樣就保證了不同的ContextImpl訪問的是同一套資源,注意,這裏說的同一套資源未必是同一個資源,因爲資源可能位於不同的目錄,但它一定是我們的應用的資源,或許這樣來描述更準確,在設備參數和顯示參數不變的情況下,不同的ContextImpl訪問到的是同一份資源。設備參數不變是指手機的屏幕和android版本不變,顯示參數不變是指手機的分辨率和橫豎屏狀態。也就是說,儘管Application、Activity、Service都有自己的ContextImpl,並且每個ContextImpl都有自己的mResources成員,但是由於它們的mResources成員都來自於唯一的ResourcesManager實例,所以它們看似不同的mResources其實都指向的是同一塊內存(C語言的概念),因此,它們的mResources都是同一個對象(在設備參數和顯示參數不變的情況下)。在橫豎屏切換的情況下且應用中爲橫豎屏狀態提供了不同的資源,處在橫屏狀態下的ContextImpl和處在豎屏狀態下的ContextImpl訪問的資源不是同一個資源對象。

說明參數不變的情況使用同一份資源,出現上面的問題是參數發生變化了,也就是在setLanguage中設置的Locale又恢復到默認狀態了。
解決此問題即在Activity.onCreate()、onConfigurationChanged(Configuration newConfig)中再次調用setLanguage()方法進行設置,保證參數變更時,Resources.configuration處於同步狀態的Locale.  
2.  關於調用setLanguage()方法後界面並未發生變化    
 調用此方法並不會觸發onCreate()方法或者界面刷新,所以需要自己維護Activity棧。
 解決:變更語言後,打開MainActivity(主界面),然後結束非棧頂的所有Activity。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章