Android 語言切換的方法,華為、小米手機語言切換語言後部分頁面會自動變為簡體中文
阿新 • • 發佈:2019-01-01
前言
最近做了一款軟體需要用到國際化(語言切換),同事負責這個模組,但是有bug,華為和小米手
機切換英文後,過一段時間部分模組會自動變回中文,他問我有沒有遇到這個問題,我研究了一下
最後發現了問題原因。
正文:
切換語言的方法:
1、首先要在AndroidManifest.xml中的所有Activity加上標誌位,尤其在Android4.2之後不僅要加上
locale標誌還要加上layoutdirection標誌位。只有這樣,重啟MainActivity的時候,
AcitivityManagerService不會把MainActivity作為重啟,也就是不會重新執行它的生命週期,而是直
接呼叫了onConfigurationChanged的方法。
2、語言按鈕的點選
switch (view.getId()) { case R.id.rl_back: finish(); break; case R.id.rl_jianti: if(!spUtils.getJianTi()){ initLanguage(Locale.SIMPLIFIED_CHINESE); goToNewActivity(); spUtils.saveJianTi(true); spUtils.saveFanTi(false); spUtils.saveEnglish(false); tv_jianti.setSelected(true); tv_fanti.setSelected(false); tv_english.setSelected(false); } break; case R.id.rl_fanti: if(!spUtils.getFanTi()){ initLanguage(Locale.TRADITIONAL_CHINESE); goToNewActivity(); spUtils.saveJianTi(false); spUtils.saveFanTi(true); spUtils.saveEnglish(false); tv_jianti.setSelected(false); tv_fanti.setSelected(true); tv_english.setSelected(false); } break; case R.id.rl_english: if (!spUtils.getEnglish()){ initLanguage(Locale.ENGLISH); goToNewActivity(); spUtils.saveJianTi(false); spUtils.saveFanTi(false); spUtils.saveEnglish(true); tv_jianti.setSelected(false); tv_fanti.setSelected(false); tv_english.setSelected(true); } break; }
上面就是點選按鈕切換不同的語言 ,先設定語言的配置,然後重新啟動MainActivity,這裡
沒有重啟App,只是清除了之前的任務棧,重新生成一個任務棧,啟動MainActivity,同時對
設置的狀態持久化(如果重啟MainActivity的時候會有段時間的白屏的話,就不要重新生成任
務棧)。
就是設定Configuration的語言引數來切換語言的。然後通過EventBus通知MainActivity重新啟動public void initLanguage(Locale locale) { Resources resources = getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); config.setLocale(locale); resources.updateConfiguration(config, dm); }
MessageEvent messageEvent = new MessageEvent();
messageEvent.setMessage(MessageEvent.FINISH_ACTIVITY);
EventBus.getDefault().post(messageEvent);
finish();
3、重啟MainActivity
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
if (event.getMessage() == MessageEvent.LOGOIN_DL) {
goToShiJian();
initTongBu();
} else if (event.getMessage() == MessageEvent.FINISH_ACTIVITY) {
finish();
Intent intent = new Intent( mActivity, MainActivity.class );
//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra( LOGIN_LANGUAGE, LOGIN_LANGUAGE );
startActivity( intent );
Log.i( "onMessageEvent: ", event.getMessage() + " - " );
}
}
遇到的問題:
切換成英文或者繁體的時候,切換fragment,會發現部分頁面變回了簡體中文。經過log列印,
發現這部分的fragment的的語言變回了中文。
Log.i(TAG, "###"+ AppUtils.getAppContext().getResources().getConfiguration().locale.getLanguage());
為了不再重新建立fragment,所有的fragment都不是通過replace載入的,而是通過hidde
和show進行切換的。對於華為手機、小米手機,在切換fragment的時候,fragment的
Configuration的語配置就會恢復預設的簡體中文。所以對這兩種手機的特性就要在
BaseFragment重新配置他的Configuration,這樣不管fragment如何切換就不會有問題了。
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
Log.i(TAG, "###base "+ AppUtils.getAppContext().getResources().getConfiguration().locale.getLanguage());
initLanguageChange();
}
private void initLanguageChange() {
SpUtils spUtils = SpUtils.getInstance( mActivity );
if (spUtils.getJianTi()) {
initLanguage( Locale.SIMPLIFIED_CHINESE );
}
if (spUtils.getFanTi()) {
initLanguage( Locale.TRADITIONAL_CHINESE );
}
if (spUtils.getEnglish()) {
initLanguage( Locale.ENGLISH );
}
}
Android語言切換原始碼分析