ToUpperCaseLocale () vs toUpperCase () – теперь настроен на Android 4.2

Поскольку я нацелен на новую версию SDK для Android, я получаю предупреждение в этой строке кода:

return getString(R.string.usertab1).toUpperCase() 

Когда я нависаю над ним, он говорит:

Неявно использование локали по умолчанию является общим источником ошибок: вместо этого используйте toUpperCase(Locale) .

Кто-нибудь знает, как удалить эту ошибку? И почему теперь это предпочтительный способ использования этого метода?

Я получаю, что это ответ, чтобы использовать toUpperCase(Locale) но не удалось его реализовать. Откуда возникает объект Locale ?

Вы можете явно использовать локаль по умолчанию:

 return getString(R.string.usertab1).toUpperCase(Locale.getDefault()); 

В принципе, вы не хотите, чтобы неявно позволяло устройству использовать значение по умолчанию, потому что это может означать, что вы просто игнорируете тот факт, что это может быть проблемой. Для машиночитаемого контента вы можете указать конкретную локаль (например, Locale.ENGLISH ), чтобы гарантировать, что вы всегда получите повторное использование, которое вы хотите получить из данных. Чтобы показать пользователя, явно указать локаль по умолчанию, должно быть хорошо.

Для более полного чтения:

Общей ошибкой является неявное использование стандартного языка при выпуске, предназначенном для машинного чтения. Это, как правило, работает на тестовых устройствах разработчика (особенно потому, что многие разработчики используют en_US), но не работает при запуске на устройстве, пользователь которого находится в более сложной локали.

Например, если вы форматируете целые числа, некоторые локали будут использовать десятичные разряды, отличные от ASCII. В качестве другого примера, если вы форматируете числа с плавающей запятой, некоторые локали будут использовать ',' как десятичную точку и '.' Для группировки цифр. Это правильно для чтения человеком, но может вызвать проблемы, если они представлены на другом компьютере (например, parseDouble(String) не может разобрать такой номер). Вы также должны быть осторожны с toLowerCase() и toUpperCase() которые не принимают локаль: в Турции, например, символы 'i' и 'I' не будут преобразованы в 'I' и 'i' . Это правильное поведение для турецкого текста (например, ввод пользователя), но не подходит, например, для HTTP-заголовков.

– Документация разработчика Locale