динамическая строка с помощью строки.xml?



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



пример:




строку PLACEHOLDER1 некоторые строки


646   9  

9 ответов:

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

Да, смотрите следующее из строковые ресурсы: форматирование и стиль

Если вам нужно Отформатировать строки с помощью 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 param используется, чтобы решить, какой формат использовать (одиночный или множественный), другие параметры являются вашими заменами:

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

посмотреть Строковые Ресурсы: Множественное Число для более подробной информации.

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

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

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

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

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

пример

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

моя сестра Mary и 12 лет старый.

строку.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() также будет форматировать строку.
  • The 1$ и 2$ термины не должны использоваться в указанном порядке. То есть, 2$ может прийти до 1$. Это полезно, когда интернационализация приложения для языков, использующих другой порядок слов.
  • вы можете использовать спецификатор формата, как %1$s несколько раз в XML, если вы хотите ее повторить.
  • использовать %% для получения % символ.
  • для получения более подробной информации прочитайте следующий полезный учебник:Android SDK Быстрый совет: форматирование строк ресурсов

Если вы хотите использовать параметр из фактических строк.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-файл, который нуждается в них.

искал то же самое и, наконец, нашел следующее Очень простое решение. Лучше всего: это работает из коробки.
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-контекст,имя является строковой переменной и графа ваша переменная int

необходимо указать

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

в вашем res / строки.XML. Работать на меня. :)

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

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

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

можно использовать 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

в 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))  

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

в 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);

Comments

    Ничего не найдено.