Подтвердить что ты не робот

Android Nougat 7.1 сбрасывает локаль после запуска WebView

У нас появилось странное поведение с Android N 7.1 (API-25). После запуска WebView система принудительно перезапускает локаль в локали устройства. Это переопределяет используемый язык (для локализации) в приложении. Легкий способ воспроизведения, чтобы получить локализацию в приложении. и запустить WebView. Затем вы больше не увидите локализованный контент, пока не снова перезапустите приложение. Это происходит только на Android-7.1 (API-25)

Вот как я переключаю Locale, который работает во всех API:

 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: Проблема 218310: [предварительный просмотр разработчика] Создание WebView сбрасывает настройки пользователя по умолчанию для пользователя

4b9b3361

Ответ 1

Вот мое решение.

Мы решили эту проблему, принудительно установив локаль снова после инициализации 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());
    }
}

Я надеюсь, что это может помочь ".

Тем не менее Im ищет лучшее решение.