Android語言國際化--7.0下的手機(jī)全屏切換后失效

最近項目上線語言國際化功能,即實現(xiàn)多語言,主要是簡體中文,繁體,英語,韓語,俄語,日語幾種語言,俄語惡心的我想哭,簡單的一個詞超級長一串,弄的我基本上每個頁面都調(diào)整了下布局,否則丑的哭...

關(guān)于如何切換多語言我就不說了,網(wǎng)上很多方法(注意適配7.0,因為7.0上的切換語言的方法接口有變化,已被坑)。在我調(diào)整了布局后還挺高興,因為大工程結(jié)束了啊,然而還是太年輕。測試時發(fā)現(xiàn)視頻播放界面全屏切換后多語言設(shè)置失效了,之前app設(shè)置的日語又變成了系統(tǒng)默認(rèn)的簡體中文。
當(dāng)屏幕旋轉(zhuǎn)(全屏切換)失效,就設(shè)置了activity的

android:configChanges="locale|orientation|keyboardHidden|screenSize"

還是無效,網(wǎng)絡(luò)上查找資料,發(fā)現(xiàn)解決方案如下:
1.新建AppContext,繼承自Application,重寫onConfigurationChanged()方法

  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        LogUtils.e("language test");
        super.onConfigurationChanged(newConfig);
        LanguageUtil.setLocale(this);
    }
  1. LanguageUtil.setLocale(this)方法是設(shè)置當(dāng)前app的語言,比如app選擇的日語,就把語言設(shè)置為日語
 public static Context setLocale(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return createConfigurationResources(context);
        } else {
           setConfiguration();
            return context;
        }
    }

3.AndroidManifest.xml文件中application節(jié)點下設(shè)置name為AppContext,設(shè)置android:configChanges

 <application
        android:name=".AppContext"
        android:configChanges="orientation|screenSize|locale"

屏幕旋轉(zhuǎn)時會觸發(fā)onConfigurationChanged(Configuration newConfig)方法時。這個newConfig取的是系統(tǒng)的,這就是為什么語言會切換到系統(tǒng)語言的原因。所以在這里我們再次設(shè)置下locale就能夠了。
或許會疑惑為什么7.0上的設(shè)備屏幕旋轉(zhuǎn)后沒有出現(xiàn)這個問題呢,那是因為前面提到過的7.0的設(shè)備切換語言接口發(fā)生了變化,是針對于每個activity或者說context對象生效,而7.0以下的設(shè)備是全局的application對象設(shè)置語言切換生效

/**
*7.0切換語言方法
**/
  @TargetApi(Build.VERSION_CODES.N)
    private static Context createConfigurationResources(Context context) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        //getLanguageLocale()獲取當(dāng)前設(shè)置的語言
        Locale locale =getLanguageLocale();
        configuration.setLocale(locale);
        return context.createConfigurationContext(configuration);
    }

/**
     * 7.0以下設(shè)置語言切換方法
     */
    public void setConfiguration() {
       //getLanguageLocale()獲取當(dāng)前設(shè)置的語言
        Locale targetLocale = getLanguageLocale();
        //mContext是全局的application對象
        Configuration configuration = mContext.getResources().getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(targetLocale);
        } else {
            configuration.locale = targetLocale;
        }
        Resources resources = mContext.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        resources.updateConfiguration(configuration, dm);//語言更換生效的代碼!
    }

好了,記錄下這個問題,坑了我浪費(fèi)大半天時間...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容