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 сбрасывает Locale на пользовательские значения по умолчанию


person Maher Abuthraa    schedule 08.11.2016    source источник


Ответы (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");
    }

Мое приложение:

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());
    }
}

Надеюсь, это поможет».

Я все еще ищу лучшее решение.

person Maher Abuthraa    schedule 08.11.2016
comment
пока это единственное решение: | - person Bahaa Odeh; 07.11.2017
comment
@Maher Вы нашли лучшее решение проблемы? Я использую обходной путь, который вы упомянули выше, уже пару месяцев, но недавно я снова получил жалобы на ту же проблему. Проблема до сих пор не решена и в трекере Google, и я не могу найти лучшего решения. - person N. Park; 01.10.2018