динамическая строка с использованием String.xml?

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

Пример:

некоторая строка PLACEHOLDER1 еще несколько строк

Форматирование и стилизация

Да, см. Следующее из String Resources: Форматирование и стилизация

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

 Hello, %1$s! You have %2$d new messages. 

В этом примере строка формата имеет два аргумента: %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); 

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

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

  Hello, %1$s! You have a new message. Hello, %1$s! You have %2$d new messages.  

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

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

Дополнительные сведения см. В разделе « Ресурсы строк: Plurals» .

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

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

Маркеры замещения формата строки в xml представлены в виде

 %[parameter index]$[format type] 
  • Параметр index : Если у вас было три части строки, которую вы хотели заменить, тогда они будут называться %1 , %2 и %3 . Заказ, который вы размещаете в строке ресурса, не имеет значения, только порядок, String.format параметрами в String.format .
  • format type : Существует много способов форматирования ( см. документацию ). Вот некоторые общие:

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

пример

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

Моей сестре Mary 12 лет.

string.xml

 My sister %1$s is %2$d years old. 

MyActivity.java

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

Заметки

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

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

    ]>  &appname; The &appname; app was created by &author;  

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

Ищет то же самое и, наконец, нашел следующее очень простое решение. Лучшее: это работает из коробки.
1. измените исходный текст строки:

 Hello, %s! You have %d new messages. 

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

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

где c – это контекст, имя – строковая переменная и подсчитывает вашу переменную int

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

  

в вашем res / strings.xml. Работает на меня. 🙂

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

Котлинская версия принятого ответа …

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

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

 Wellcome: {0} {1} 

В коде Java:

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

Уровень API 1:

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

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

 "%1$d ~ %2$s" 

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

  

Затем сделайте это в своем коде, если вы используете 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)) 

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

в res / values ​​/ string.xml

  Hello World Application name: %s, package name: %s  

в 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); 
  • Обратное упорядочение слов в строке
  • Разделить строку с разделителями на C
  • sizeof в c ++, показывающий размер строки один меньше
  • Как создать более удобный синтаксис string.format?
  • Использование getline () в C ++
  • Разделить NSString для доступа к одной конкретной части
  • Как получить первые n символов строки без проверки размера или выхода за пределы?
  • Правильный способ разбить std :: string на вектор
  • Преобразование String в Uri
  • Как можно угадать кодировку строки в Perl?
  • Строка соединения SQL Server Express для Entity Framework Code First
  • Interesting Posts

    MySQL с учетом регистра запросов

    Как преобразовать изображение растрового изображения низкого качества в вектор?

    Удалить / Удалить текущую строку в Notepad ++

    notifyDataSetChanged () делает обновление списка и прокручивает подсказки назад

    Расширить сеть, подключив беспроводной маршрутизатор к проводному маршрутизатору?

    Рельсы: не удалось найти рейды

    Измените строку с помощью указателя

    Как работает int.TryParse

    Универсальная утилита / драйвер мыши для переключения мыши

    Как перемещаться по карте карт C ++?

    Многозначный параметр SSRS с использованием хранимой процедуры

    Почему Collections.sort использует Mergesort, но Arrays.sort нет?

    Как проверить физическое состояние USB-накопителя в Linux?

    Невозможно создать постоянное значение типа В этом контексте поддерживаются только примитивные типы или типы перечислений

    Как я могу использовать атрибуты проверки данных в C # в контексте nonASP.net?

    Давайте будем гением компьютера.