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