最近項目上線語言國際化功能,即實現(xiàn)多語言,主要是簡體中文,繁體,英語,韓語,俄語,日語幾種語言,俄語惡心的我想哭,簡單的一個詞超級長一串,弄的我基本上每個頁面都調(diào)整了下布局,否則丑的哭...
關(guān)于如何切換多語言我就不說了,網(wǎng)上很多方法(注意適配7.0,因為7.0上的切換語言的方法接口有變化,已被坑)。在我調(diào)整了布局后還挺高興,因為大工程結(jié)束了啊,然而還是太年輕。測試時發(fā)現(xiàn)視頻播放界面全屏切換后多語言設(shè)置失效了,之前app設(shè)置的日語又變成了系統(tǒ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);
}
- LanguageUtil.setLocale(this)方法是設(shè)置當前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()獲取當前設(shè)置的語言
Locale locale =getLanguageLocale();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
/**
* 7.0以下設(shè)置語言切換方法
*/
public void setConfiguration() {
//getLanguageLocale()獲取當前設(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);//語言更換生效的代碼!
}
好了,記錄下這個問題,坑了我浪費大半天時間...