Как использовать форматированные строки вместе с заполнителями в Android?

В Android можно использовать заполнители в строках, например:

<string name="number">My number is %1$d</string> 

А затем в Java-коде (внутри подкласса Activity ):

 String res = getString(R.string.number); String formatted = String.format(res, 5); 

Или даже проще:

 String formatted = getString(R.string.number, 5); 

Также возможно использовать некоторые HTML-теги в строковых ресурсах Android:

 <string name="underline"><u>Underline</u> example</string> 

Поскольку сама String не может хранить информацию о форматировании, следует использовать getText(int) вместо метода getString(int) :

 CharSequence formatted = getText(R.string.underline); 

CharSequence может быть затем передан в виджеты Android, такие как TextView , и выделенная фраза будет подчеркнута.

Однако я не мог найти, как объединить эти два метода, используя форматированную строку вместе с заполнителями:

 <string name="underlined_number">My number is <u>%1$d</u></string> 

Как обработать выше ресурса в Java-коде, чтобы отобразить его в TextView , заменив %1$d целым числом?

Solutions Collecting From Web of "Как использовать форматированные строки вместе с заполнителями в Android?"

Наконец, мне удалось найти рабочее решение и написать собственный метод для замены заполнителей, сохраняя форматирование:

 public static CharSequence getText(Context context, int id, Object... args) { for(int i = 0; i < args.length; ++i) args[i] = args[i] instanceof String? TextUtils.htmlEncode((String)args[i]) : args[i]; return Html.fromHtml(String.format(Html.toHtml(new SpannedString(context.getText(id))), args)); } 

Этот подход не требует, чтобы избежать тегов HTML вручную ни в форматируемой строке, ни в строках, которые заменяют заполнители.

 <resources> <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string> </resources> Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); CharSequence styledText = Html.fromHtml(text); 

Дополнительная информация здесь: http://developer.android.com/guide/topics/resources/string-resource.html

Для простого случая, когда вы хотите заменить местозаполнитель без форматирования номера (т.е. начальные нули, цифры после запятой), вы можете использовать библиотеку Square Phrase .

Использование очень простое: сначала вы должны сменить заполнители в своем строчном ресурсе на этот более простой формат:

 <string name="underlined_number">My number is <u> {number} </u></string> 

То вы можете сделать замену следующим образом:

 CharSequence formatted = Phrase.from(getResources(), R.string.underlined_number) .put("number", 5) .format() 

CharSequence также оформлен в стиле. Если вам нужно отформатировать свои номера, вы всегда можете предварительно форматировать их с помощью String.format("%03d", 5) а затем использовать результирующую строку в функции .put() .