динамическая строка с использованием String.xml? - PullRequest
417 голосов
/ 07 сентября 2010

Возможно ли иметь заполнители в строковых значениях в string.xml, которым можно присваивать значения во время выполнения?

Пример:

немного строки PLACEHOLDER1 немного строки

Ответы [ 9 ]

914 голосов
/ 07 сентября 2010

Форматирование и стиль

Да, см. Строковые ресурсы: форматирование и стилизация

Если вам нужно отформатировать строки, используя String.format(String, Object...), вы можете сделать это, поместив аргументы формата в строковый ресурс. Например, со следующим ресурсом:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

В этом примере строка формата имеет два аргумента: %1$s является строкой и %2$d является десятичным числом. Вы можете отформатировать строку с аргументами из вашего приложения следующим образом:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

Основное использование

Обратите внимание, что getString имеет перегрузку, которая использует строку в качестве строки формата:

String text = res.getString(R.string.welcome_messages, username, mailCount);

Множественное

Если вам нужно обработать множественное число, используйте это:

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

Первый параметр mailCount используется, чтобы решить, какой формат использовать (одиночный или множественный), другие параметры - ваши замены:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

Подробнее см. Ресурсы строк: множественное число .

211 голосов
/ 21 ноября 2016

Дополнительный ответ

Когда я впервые увидел %1$s и %2$d в принятом ответе, это не имело смысла.Вот еще немного объяснения.

Они называются спецификаторами формата.В строке xml они имеют вид

%[parameter_index$][format_type] 
  • % : знак процента отмечает начало спецификатора формата.
  • индекс параметра : это число, за которым следует знак доллара.Если у вас есть три параметра, которые вы хотите вставить в строку, они будут называться 1$, 2$ и 3$.Порядок размещения их в строке ресурса не имеет значения, только порядок, в котором вы указываете параметры.
  • тип формата : существует лот способов, которыми вы можете форматировать вещи ( см. документацию ).Вот некоторые из них:

    • s строка
    • d десятичное целое число
    • f число с плавающей запятой

Пример

Мы создадим следующую отформатированную строку, в которую серые части вставлены программно.

Моя сестра Mary имеет возраст 12.

string.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

MyActivity.java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

Примечания

  • Я мог бы использовать getString, потому что был в Деятельности.Вы можете использовать context.getResources().getString(...), если он недоступен.
  • String.format() также отформатирует строку.
  • Термины 1$ и 2$ не нужно использовать вэтот порядок.То есть 2$ может предшествовать 1$.Это полезно при интернационализации приложения для языков, которые используют другой порядок слов.
  • Вы можете использовать спецификатор формата, например %1$s, несколько раз в xml, если хотите повторить его.
  • Используйте %% для получения действительного % символа.
  • Для получения более подробной информации прочитайте следующее полезное руководство: Android SDK Быстрый совет: Форматирование строк ресурса
115 голосов
/ 23 июля 2014

Если вы хотите использовать параметр из фактического файла strings.xml без использования кода Java:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

Это не работает для файлов ресурсов, т. Е. Переменные должны быть скопированы в каждый файл XML, в котором они нужны.

16 голосов
/ 05 июня 2015

Искал то же самое и, наконец, нашел следующее очень простое решение.Лучше всего: он работает «из коробки».
1. Измените ваш ресурс:

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2.используйте подстановку строк:

c.getString(R.string.welcome_messages,name,count);

, где c - контекст, name - строковая переменная и count ваша переменная int

Вам нужно будет включить

<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">

в ваш файл res / strings.xml.Работает для меня.:)

2 голосов
/ 10 апреля 2012

Тем не менее, вы также должны прочитать Elias Mårtenson ответ на множественное число Android трактует «ноль» . Существует проблема с интерпретацией некоторых значений, таких как «ноль».

1 голос
/ 17 июля 2018

в res / values ​​/ string.xml

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

в коде Java

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
1 голос
/ 10 октября 2017

В Kotlin вам просто нужно установить строковое значение следующим образом:

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

Создайте текстовое представление на вашем макете:

<TextView android:id="@+id/song_number_and_title"/>

Затем сделайте это в своем коде, если выиспользуя Anko:

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

Возможно, вам потребуется получить ресурсы из контекста приложения.

0 голосов
/ 20 сентября 2017

Вы можете использовать MessageFormat

<string name="customer_address">Wellcome: {0} {1}</string>

В коде Java:

String text =MessageFormat(R.string.customer_address).format("Name","Family");

Уровень API 1:

https://developer.android.com/reference/java/text/MessageFormat.html

0 голосов
/ 22 июня 2017

Kotlin версия принятого ответа ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
...