Ответ 1
Ну, через много часов, вот решение моей проблемы для тех, кто заканчивается той же проблемой.
Оказывается, что resConfig не для чего я. Правильный и единственный способ, которым я нашел, чтобы заставить локаль для конкретного аромата, выглядит следующим образом:
Во-первых, убедитесь, что все ваши действия расширяют общую деятельность, которая будет нести ответственность за создание локали. (Мне пришлось создать 2, так как у меня есть некоторые действия, расширяющие FragmentActivity и некоторые расширяющие Activity. Мне также не нравится делать это в конструкторе Activities, но поскольку мне нужно вызвать applyOverrideConfiguration, прежде чем любой вызов будет выполнен на getResources, мне нужно позвонить это перед активностью в начале).
public class LocaleMainActivity extends Activity {
public LocaleMainActivity() {
ActivityUtils.forceLocale(this);
}
}
public class LocaleMainFragmentActivity extends FragmentActivity {
public LocaleMainFragmentActivity() {
ActivityUtils.forceLocale(this);
}
}
//Method from ActivityUtils
public static void forceLocale(ContextThemeWrapper contextThemeWrapper) {
Configuration configuration = new Configuration();
Locale defaultLocale = new Locale(BuildConfig.LOCALE);
configuration.locale = defaultLocale;
contextThemeWrapper.applyOverrideConfiguration(configuration);
}
Затем вам нужно определить языковой стандарт в ваших вариантах build.gradle
productFlavors {
myFrenchFlavor {
buildConfigField "String", "LOCALE", "\"fr\""
}
myEnglishFlavor {
buildConfigField "String", "LOCALE", "\"en\""
}
}
Я тестировал решение по API 19+. Работает, когда вы меняете язык и в приложении.
Альтернативное решение (не будет работать на Android M + см. отчет об ошибке в Android)
Это решение широко распространяется на stackOverflow, но я столкнулся с стеной, реализуя это на Android M, поэтому имейте это в виду.
В onCreate() вашего AndroidApplication вы можете вызвать updateConfiguration с набором локалей.
Locale myLocale = new Locale(BuildConfig.LOCALE);
Resources res = getResources();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, res.getDisplayMetrics());
Вам также понадобится reset его, если вы определили onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Configuration config = new Configuration(newConfig);
config.locale = new Locale(BuildConfig.LOCALE);
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
РЕДАКТИРОВАТЬ: Имейте в виду, что этот applyOverrideConfiguration в настоящее время имеет побочный эффект, который объясняется здесь Chromium webview, похоже, не работает с Android applyOverrideConfiguration, Команда Chromium в настоящее время работает над этим!
Спасибо.