最近項(xiàng)目上線語言國(guó)際化功能铁材,即實(shí)現(xiàn)多語言,主要是簡(jiǎn)體中文绢涡,繁體瞄桨,英語,韓語洒宝,俄語购公,日語幾種語言,俄語惡心的我想哭雁歌,簡(jiǎn)單的一個(gè)詞超級(jí)長(zhǎng)一串宏浩,弄的我基本上每個(gè)頁面都調(diào)整了下布局,否則丑的哭...
關(guān)于如何切換多語言我就不說了靠瞎,網(wǎng)上很多方法(注意適配7.0比庄,因?yàn)?.0上的切換語言的方法接口有變化求妹,已被坑)。在我調(diào)整了布局后還挺高興佳窑,因?yàn)榇蠊こ探Y(jié)束了啊制恍,然而還是太年輕。測(cè)試時(shí)發(fā)現(xiàn)視頻播放界面全屏切換后多語言設(shè)置失效了神凑,之前app設(shè)置的日語又變成了系統(tǒng)默認(rèn)的簡(jiǎ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);
}
- 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é)點(diǎn)下設(shè)置name為AppContext,設(shè)置android:configChanges
<application
android:name=".AppContext"
android:configChanges="orientation|screenSize|locale"
屏幕旋轉(zhuǎn)時(shí)會(huì)觸發(fā)onConfigurationChanged(Configuration newConfig)方法時(shí)型宝。這個(gè)newConfig取的是系統(tǒng)的八匠,這就是為什么語言會(huì)切換到系統(tǒng)語言的原因。所以在這里我們?cè)俅卧O(shè)置下locale就能夠了趴酣。
或許會(huì)疑惑為什么7.0上的設(shè)備屏幕旋轉(zhuǎn)后沒有出現(xiàn)這個(gè)問題呢梨树,那是因?yàn)榍懊嫣岬竭^的7.0的設(shè)備切換語言接口發(fā)生了變化,是針對(duì)于每個(gè)activity或者說context對(duì)象生效岖寞,而7.0以下的設(shè)備是全局的application對(duì)象設(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對(duì)象
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);//語言更換生效的代碼!
}
好了抡四,記錄下這個(gè)問題,坑了我浪費(fèi)大半天時(shí)間...