最近項目上線語言國際化功能,即實現多語言,主要是簡體中文,繁體,英語,韓語,俄語,日語幾種語言,俄語惡心的我想哭,簡單的一個詞超級長一串,弄的我基本上每個頁面都調整了下布局,否則丑的哭...
關于如何切換多語言我就不說了,網上很多方法(注意適配7.0,因為7.0上的切換語言的方法接口有變化,已被坑)。在我調整了布局后還挺高興,因為大工程結束了啊,然而還是太年輕。測試時發現視頻播放界面全屏切換后多語言設置失效了,之前app設置的日語又變成了系統默認的簡體中文。
當屏幕旋轉(全屏切換)失效,就設置了activity的
android:configChanges="locale|orientation|keyboardHidden|screenSize"
還是無效,網絡上查找資料,發現解決方案如下:
1.新建AppContext,繼承自Application,重寫onConfigurationChanged()方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
LogUtils.e("language test");
super.onConfigurationChanged(newConfig);
LanguageUtil.setLocale(this);
}
- LanguageUtil.setLocale(this)方法是設置當前app的語言,比如app選擇的日語,就把語言設置為日語
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節點下設置name為AppContext,設置android:configChanges
<application
android:name=".AppContext"
android:configChanges="orientation|screenSize|locale"
屏幕旋轉時會觸發onConfigurationChanged(Configuration newConfig)方法時。這個newConfig取的是系統的,這就是為什么語言會切換到系統語言的原因。所以在這里我們再次設置下locale就能夠了。
或許會疑惑為什么7.0上的設備屏幕旋轉后沒有出現這個問題呢,那是因為前面提到過的7.0的設備切換語言接口發生了變化,是針對于每個activity或者說context對象生效,而7.0以下的設備是全局的application對象設置語言切換生效
/**
*7.0切換語言方法
**/
@TargetApi(Build.VERSION_CODES.N)
private static Context createConfigurationResources(Context context) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
//getLanguageLocale()獲取當前設置的語言
Locale locale =getLanguageLocale();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
/**
* 7.0以下設置語言切換方法
*/
public void setConfiguration() {
//getLanguageLocale()獲取當前設置的語言
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);//語言更換生效的代碼!
}
好了,記錄下這個問題,坑了我浪費大半天時間...