Android7(N)中webview導致應用內語言切換失效
阿新 • • 發佈:2019-02-09
之前負責的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);
}
}
}