1. 程式人生 > >Android 語言切換的方法,華為、小米手機語言切換語言後部分頁面會自動變為簡體中文

Android 語言切換的方法,華為、小米手機語言切換語言後部分頁面會自動變為簡體中文

前言

最近做了一款軟體需要用到國際化(語言切換),同事負責這個模組,但是有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的時候會有段時間的白屏的話,就不要重新生成任

務棧)。

  public void initLanguage(Locale locale) {
        Resources resources = getResources();
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        config.setLocale(locale);
        resources.updateConfiguration(config, dm);
    }
就是設定Configuration的語言引數來切換語言的。然後通過EventBus通知MainActivity重新啟動
      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語言切換原始碼分析