Изменение языкового стандарта, программно не работающего на некоторых устройствах

У меня есть следующий код:

/** * Sets a new Locale for the APP. * @param newLocale - Valid new locale. */ private static void setLocale( String newLocale ) { Locale locale = new Locale( newLocale ); Locale.setDefault( locale ); Configuration config = new Configuration(); config.locale = locale; context.getResources().updateConfiguration( config, context.getResources().getDisplayMetrics() ); } 

Просто.

Однако, когда я запускаю его на смартфоне (4.1.1), он работает безупречно. Устройство меняет строку, чтобы соответствовать языку.

Но с планшетом (4.3) он не работает. Если я выдаю что-то вроде:

 Log.d("TAG",Locale.getDefault()); 

Кажется, что Locale изменен на обоих устройствах, но, как я уже сказал, Strings не переводится на правильный язык.

Я провел много отладки, и я обнаружил разницу между объектами. Проверьте объект Configuration на 4.1.1:

Введите описание изображения здесь

И проверьте объект конфигурации на планшете (4.3) Введите описание изображения здесь

Как вы можете видеть, единственное заметное отличие – это userSetLocale которого установлено значение False на планшете.

Поэтому я проверил Google SourceCode ( https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/res/Configuration.java ) и в нем говорится:

  /** * Locale should persist on setting. This is hidden because it is really * questionable whether this is the right way to expose the functionality. * @hide */ public boolean userSetLocale; 

Похоже, это влияет на меня. Так как я не могу получить доступ к этому значению, ни к getter / setter, ни к публичному доступу, я использовал отражение, чтобы изменить его.

Однако, после изменения его отражением, хотя я видел, что он внутренне изменился (логическое значение установлено на false после отражения), та же проблема все еще сохраняется.

У вас есть какие-нибудь советы?

Тем временем я продолжу тестирование.

Благодарю. ИСПЫТАНИЯ:

  • Nexus 10 – 4.4.2 – ОК
  • Nexus 5 – 4.4.2 – ОК
  • Планшет 320 dpi – 4.4.2 – OK
  • SmartPhone 480 dpi – 4.3 – OK
  • SmartPhone 160 dpi – 4.1.1 – OK
  • Планшет 160 dpi – 4.3 – НЕ ОК
  • SmartPhone 320 dpi – 4.1.1 – ОК

Это код, который я использую для локализации. Он используется людьми + 1 м и никогда не слышал о жалобах на изменение строк, поэтому я надеюсь, что это сработает и для вас:

В верхней части класса:

 Locale myLocale; 

Функция:

  public void setLocale(String lang) { myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, dm); reloadUI(); // you may not need this, in my activity ui must be refreshed immediately so it has a function like this. } 

Вызов функции:

 //example for setting English setLocale("en_gb"); 

Что ж,

Пользователь Sir SC дал ответ, который сработал. Но мой код тоже работал. Проблема, с которой мы столкнулись, касалась одного устройства, игнорирующего это изменение локали. Таким образом, AFAIK, это всего лишь одно устройство, и это может быть вызвано из-за неисправного ПЗУ, поскольку это был эмулятор Genymotion.

В общем, ответ:

  • Код OP размещен, действителен и работает. Так что код от сэра SC.

Приветствия.