Android Nougat 7.1在启动WebView后重置Locale

时间:2016-11-08 12:25:55

标签: android webview android-7.1-nougat

我们在Android N 7.1(API-25)中遇到了一个奇怪的行为。在启动WebView之后,系统强制将Locale重置为设备区域设置。这会覆盖应用程序上使用的区域设置(用于本地化)。重现的简便方法是在应用程序上进行本地化。并启动WebView。然后,在您再次重新启动应用之前,您不会再看到本地化内容。这只发生在Android-7.1(API-25)

以下是我如何切换适用于所有API的Locale:

 public void switchToCzLocale() {
        Locale mLocale = new Locale("cs","CZ");// it can be any other Locale
        Configuration config = getBaseContext().getResources()
                .getConfiguration();
        Locale.setDefault(mLocale);
        config.setLocale(mLocale);
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }

我上传了一个示例来重现该问题,详细信息如下:

https://github.com/mabuthraa/WebView-android7-issue

请知道这种行为是否是一个错误,或者可能是不正确地改变了语言环境。

以下是Android群发票的链接:Issue 218310: [developer preview] Creating a WebView resets Locale to user defaults

1 个答案:

答案 0 :(得分:11)

这是我的解决方案。

我们通过在初始化webView之后和加载内容之前再次强制设置区域设置来解决该问题:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  MyApp.getApplication().switchToCzLocale();
}

例如在WebActivity中:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        mWebView = (WebView) findViewById(R.id.webview);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          MyApp.getApplication().switchToCzLocale();
        }
        mWebView.loadData(getString(R.string.web_content), "text/html", "charset=UTF-8");
    }

MyApp的:

import android.app.Application;
import android.content.res.Configuration;

import java.util.Locale;


public class MyApp extends Application {
    private static MyApp sApplication;

    @Override
    public void onCreate() {
        super.onCreate();
        switchToCzLocale();
        sApplication = this;
    }

    public static MyApp getApplication() {
        return sApplication;
    }

    public void switchToCzLocale() {
        Locale mLocale = new Locale("cs","CZ");
        Configuration config = getBaseContext().getResources()
                .getConfiguration();
        Locale.setDefault(mLocale);
        config.setLocale(mLocale);
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }
}

我希望这可能有所帮助,'。

我仍在寻找更好的解决方案。