1. 程式人生 > >Android7(N)中webview導致應用內語言切換失效

Android7(N)中webview導致應用內語言切換失效

之前負責的APP中做了應用內語言切換。但是後來測試提出bug,在Android7(N)的手機中會發生語言混亂的現象。經檢視,發現只要是打開了含有WebView的頁面,應用內語言切換就會失效。一口老血噴出來。

好吧,既然問題出現了。那就開始著手搜尋解決。

之後在萬能的StackOverFlow上找到了如下問題及回答:

好吧簡單總結一下這個問題的產生原因及解決方案。

1、問題原因:

    在Android7(N)之前WebView的渲染是通過Android System webView來實現的。但是在Android7(N)之後WebView會被作為一個應用程式的方式服務於各個三方APP。由於WebView這裡是作為一個單獨的應用程式,所以他不會被繫結到你自己APP設定的Local上。不僅如此,WebView還會把語言變成裝置的Local設定。然後相應的資原始檔也會被變成裝置語言下的資原始檔。這樣就導致了只要打開了含有WebView的頁面,應用內語言設定就失效的問題。

2、解決方案:

    (1)第1步,在所有Activity下重設語言。StackOverFlow的回答中說也可以只在含有WebView的Activity中重設。但是各位,為了保證不給自己挖坑,還是全設定掉好一點。在你的BaseActivity中,並且在呼叫setContentView之前呼叫如下程式碼設定你的Local:

public static void setLocale(Locale locale){
    Locale.setDefault(locale);
    Context context = MusafirApplication.getInstance();
    final Resources resources = context.getResources();
    final Configuration config = resources.getConfiguration();
    config.setLocale(locale);
    context.getResources().updateConfiguration(config,
            resources.getDisplayMetrics());
}

    (2)第2步:在你的Application的onCreate方法中新增如下程式碼:

new WebView(this).destroy();

    這樣之後,問題解決。

3、我自己的實踐:

    這裡貼上我的部分程式碼,僅供參考。

    系統工具類部分程式碼:

public class SystemUtil {

    public static final String EN = "en";
    public static final String CN = "cn";

    //切換應用內語言
    public static void switchLanguage(String language) {
        Resources resources = BaseApplication.getInstance().getResources();
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (TextUtils.equals(EN, language)) {
            config.setLocale(Locale.ENGLISH);
        } else {
            config.setLocale(Locale.SIMPLIFIED_CHINESE);
        }
        resources.updateConfiguration(config, dm);
    }
    //判斷當前應用內語言是否為中文        
    public static boolean getLocalLanguageIsCN() {
        Resources resources = BaseApplication.getInstance().getResources();
        Configuration config = resources.getConfiguration();
        Locale locale = config.locale;
        if (locale.equals(Locale.ENGLISH)) {
            return false;
        } else {
            return true;
        }
    }
}

    BaseActivity類部分程式碼:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getApplicationContext();
        if (SystemUtil.getOSVersionSdkInt() >= Build.VERSION_CODES.N) {
            if (SystemUtil.getSystemLanguageIsCN()) {
                SystemUtil.switchLanguage(SystemUtil.CN);
            } else {
                SystemUtil.switchLanguage(SystemUtil.EN);
            }
        }
    }
}
    Application部分程式碼:
public class BaseApplication extends MultiDexApplication {

    private static BaseApplication sInstance = null;

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        initWebView();
    }

    //處理Android7(N)webview導致應用內語言失效的問題
    private void initWebView(){
        new WebView(this).destroy();
    }

    public static synchronized BaseApplication getInstance() {
        return sInstance;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (TextUtils.equals(SharedPreferencesUtil.getSPLocalLanguage(this), SystemUtil.CN)) {
            SystemUtil.switchLanguage(SystemUtil.CN);
        } else {
            SystemUtil.switchLanguage(SystemUtil.EN);
        }
    }

}