Красивое добавление текста в TextView android
Такая проблема: я хочу добавить текст в TextView, при этом добавляемый текст должен содержать переменные (пример "Прошло $min минут и $sec секунд"). Как сделать это правильно?
При использовании строковых ресурсов - придётся разбивать текст на отдельные фразы/слова и потом в коде их склеивать тем же append(). Само по себе ничего плохого - но тогда возникают проблемы с локализациями, ведь если я переведу пример как "$min minutes and $sec has passed", к примеру - то ломается порядок строковых ресурсов, а соответственно необходимо обрабатывать в коде данные кейсы.
Возможно я что-то упускаю и есть более лаконичный вариант/best practice, как добиться желаемого результата.
Ответы (2 шт):
Вы можете использовать переменные аналогично String.format. Следующим образом:
<string name="time_passed">Прошло %1$d минут и %2$d секунд</string>
И в коде:
int munites = 10;
int seconds = 35;
textView.setText(textView.getContext().getString(R.string.time_passed, minutes, seconds); // Прошло 10 минут и 35 секунд
Возможно вам понадобятся также работа с множественными числами:
<plurals name="minute_plurals">
<item quantity="zero"></item>
<item quantity="one">%1$d минута</item>
<item quantity="two">%1$d минуты</item>
<item quantity="few">%1$d минуты</item>
<item quantity="many">%1$d минут</item>
<item quantity="other">%1$d минут</item>
</plurals>
И в коде:
int munites = 10;
textView.setText(textView.getContext().getResources().getQuantityString(R.plurals.minute_plurals, minutes,minutes)); // 10 минут
При этом возможно придется-таки комбинировать несколько строковых ресурсов (для минут конкатенировать с секундами), тогда что-то типа такого будет:
<string name="time_passed">Прошло %1$s и %2$s</string>
<plurals name="minute_plurals">
<item quantity="zero"></item>
<item quantity="one">%1$d минута</item>
<item quantity="two">%1$d минуты</item>
<item quantity="few">%1$d минуты</item>
<item quantity="many">%1$d минут</item>
<item quantity="other">%1$d минут</item>
</plurals>
<plurals name="second_plurals">
<item quantity="zero"></item>
<item quantity="one">%1$d секунда</item>
<item quantity="two">%1$d секунды</item>
<item quantity="few">%1$d секунды</item>
<item quantity="many">%1$d секунд</item>
<item quantity="other">%1$d секунд</item>
</plurals>
И в коде:
textView.setText(
context.getString(R.string.time_passed,
context.getResources().getQuantityString(R.plurals.minute_plurals, minutes,minutes),
context.getResources().getQuantityString(R.plurals.second_plurals, seconds,seconds));
NB Что касается множественных чисел, надо также учитывать, что для разных локалей набор возможных значений quantity может отличаться. Например, для китайского языка используется только other, т.е. по числам не меняется, а для русского языка zero и two не используются. В примере выше просто перечислил все возможные варианты, android studio подсвечивает какие варианты релевантны для конкретной локали).
ЗЫ Для вашей строки с моим примером будет проблема с "и" при отсутствии секунд.
строковые ресурсы поддерживают переменные
<string name="error_api_server">Серверная ошибка: %1$d</string>
context.getString(R.string.error_api_server, code)
%1$d - где: 1 номер, d - численный тип
или например
%1$s - где: 1 номер, s - строковый тип