Изменить язык программно в Android

У меня есть многоязычное приложение для Android. Мне нужно установить другой язык, чем у пользователя в настройках устройства. Когда мое приложение запускается, пользователь выбирает предпочитаемый язык. На Android 7 и ниже я использую updateconfiguration в своем классе приложения. Но это решение не работает на Android 8. Я пытаюсь использовать конфигурацию обновления в attachBaseContext в каждом действии, но безуспешно.


person Michael Drdlíček    schedule 04.09.2017    source источник
comment
проверьте этот пост: ссылка --> stackoverflow.com/questions/45088039/   -  person yash786    schedule 04.09.2017
comment
Добро пожаловать в stackoverflow.com. Пожалуйста, не могли бы вы предоставить код вашей конкретной проблемы. Это покажет, как далеко вы пытались, и это поможет другим участникам лучше понять вашу проблему, в то время как вы предоставите им контекст вашей проблемы. Пожалуйста, проверьте эти ссылки: stackoverflow.com/help/mcve и stackoverflow.com/help/how-to-ask   -  person Elias MP    schedule 04.09.2017
comment
Я точно знаю, что он имеет в виду, потому что столкнулся с той же проблемой. Решение, которое работает для Android 7 и ниже, не работает для Android 8. Михаил, вы нашли решение? В настоящее время я изучаю и опубликую и обновлю, когда выясню это.   -  person AutonomousApps    schedule 14.09.2017
comment
Вы получили решение для этого?   -  person diordna    schedule 27.09.2017
comment
Нет, я еще не нашел решения. Я пытаюсь переопределить attachBaseContext с изменением локали в действиях. Это решение работает, но оно нарушает структуру автозаполнения, и я должен вызывать его в каждом действии.   -  person Michael Drdlíček    schedule 02.10.2017
comment
@MichaelDrdlíček просто используйте его в базовом классе активности. Что вы имеете в виду, говоря, что это нарушает структуру автозаполнения?   -  person AutonomousApps    schedule 29.10.2017
comment
Когда я меняю локаль в attachBaseContext, автозаполнение предлагает от Android oreo не работать в этом действии. Я не знаю почему.   -  person Michael Drdlíček    schedule 30.10.2017


Ответы (2)


@codespy имеет правильную идею, но для более подробной информации:

У меня была точно такая же проблема в моем приложении. Сначала я думал, что проблема заключается в использовании этого устаревшего метода установки пользовательского языка:

Locale.setDefault(newLocale);
Configuration config = new Configuration();
// TODO fix deprecation issues
config.locale = newLocale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());

И поэтому я попытался использовать createConfigurationContext с помощью этого ответа, но это тоже не сработало ( и, кроме того, было намного сложнее с несколькими подводными камнями).

После обширной отладки я кое-что заметил:

MyAdapter adapter = new MyAdapter(getApplicationContext(), list);

По наитию я заменил getApplicationContext() на getContext(), и внезапно в моем списке элементов использовался правильный язык.

Оказывается, getApplicationContext() Oreo больше не учитывает установленную вами пользовательскую локаль. Вместо этого вы должны использовать контекст действия.

(Обратите внимание: я знаю, что не должен был использовать для этого контекст приложения, но это устаревшее приложение со многими такими проблемами. Их исправление — моя постоянная ежедневная борьба.)

person AutonomousApps    schedule 14.09.2017
comment
Большое спасибо, вы просто спасли мой день :) - person Wael Abo-Aishah; 29.10.2017
comment
Была аналогичная проблема при запуске инструментовки / тестов пользовательского интерфейса. Решил это с помощью InstrumentationRegistry.getTargetContext() вместо InstrumentationRegistry.getContext(). Спасибо за подсказку. - person Gandora; 02.07.2019

Пожалуйста, используйте activity.getResource() и используйте этот объект Resource. В моем случае это помощь.

person codespy    schedule 14.09.2017
comment
Это не ясное решение, рассмотрите возможность добавления некоторой строки объяснения, например, как использовать объект Resource - person Luca Murra; 29.12.2018