2016-05-10 8 views
3

Я написал многоязычное приложение.Почему андроид не распознает локаль как RTL при программном программировании?

У меня есть другая папка values для разных языков, например values-fa и values-ru. Поскольку некоторые из этих языков, таких как фарси и арабский, RTL, я использовал другой дизайн макета, поместив другой макет .xml файлов в папку layout-ldrtl рядом с основной папкой layout.

Я также поместить файл с именем is_right_to_left.xml ИНТ папку с именем values-ldrtl, который определяет переменную как это:

<bool name="is_right_to_left">true</bool> 

У меня есть один и тот же файл в папке values и установите значение переменной в false там.

Всякий раз, когда в коде мне нужно знать, я использую эту строку, чтобы понять, если текущая локаль является RTL один или нет:

isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left); 

Я тестировал приложение с различной конфигой устройства и все работает как очарование. Например, установка языка устройства на Farsi заставляет приложение читать строки с values-fa и макеты с layout-ldrtl, тогда как для арабского языка для устройства значения считаются с values-ar, а макеты также считываются с layout-ldrtl, потому что оба они являются языками RTL , Курс работает правильно и для языков LTR. Это то, что я хочу.

Проблема возникает, когда я устанавливаю локаль приложения программно. Это код, который я написал в onCreate() методы из моих MainActivity:

Locale myLocale = new Locale("fa"); 
Resources res = getResources(); 
DisplayMetrics dm = res.getDisplayMetrics(); 
Configuration conf = res.getConfiguration(); 
conf.locale = myLocale; 
res.updateConfiguration(conf, dm); 

Теперь значения считываются правильно в соответствии с языком, но layout-ldrtl и values-ldrtl никогда не читали. Таким образом, приложение будет загружаться в LTR-дизайне из-за неправильного .xml файлов и неправильного значения isRightToLeft переменной. Одно решение, которое я тестировал, помещает те файлы .xml в каждую папку языкового макета отдельно, и это работает. Но я надеюсь получить лучший и более быстрый способ решения проблемы. И, кроме того, почему андроид действует таким образом?

+0

вам нужно сделать это программным способом, или вы просто тестирование приложения делать? Если это последнее, посмотрите http://lifehacker.com/enable-androids-secret-right-to-left-layout-if-youre-le-1676267178 – petey

+0

@petey Мне нужно сделать это программно. Один случай - позволить пользователю выбрать язык приложения. Спасибо за ответ, хотя. – EmJiHash

ответ

3

попробовать это:

Resources res = getResources(); 
Configuration newConfig = new Configuration(res.getConfiguration()); 
Locale locale = new Locale("fa"); 
Locale.setDefault(locale); 
newConfig.locale = locale; 
newConfig.setLayoutDirection(locale); 
res.updateConfiguration(newConfig, null); 
+0

Спасибо, это хороший ответ, и он работает, но только для API 17+. Фактически, я сделал весь путь с двумя макетами для поддержки API минус 17 API. – EmJiHash

+0

Я проголосовал за ответ, но не отметил его как принятый. Ожидание решения, которое может работать и для предыдущих API. – EmJiHash

Смежные вопросы