Android: как внедрить элемент ‹string› в другой элемент ‹string› в XML?

Я хотел бы знать, есть ли способ вставить/вставить элемент <string>, определенный в файле XML, в другой элемент <string>, делая это только с помощью XML.

Например, я мог бы:

<string name="author">Francesco</string>`

и я ищу что-то вроде:

<string name="about_application">Author: @string/author</string>`

так что getString(R.string.about_application) приведет к "Автор: Франческо".

Я знаю, что мог бы объединить два элемента в коде Java, используя, например, String.format(string, formatArgs)like:

<string name="author">Francesco</string>
<string name="about_application">Author: %1$s</string>`

а затем в коде

String.format(getString(R.string.about_application), getString(R.string.author))

но я хотел бы сделать это напрямую в XML.

Может ли кто-нибудь предложить мне способ сделать это?


person Francesco Feltrinelli    schedule 15.09.2010    source источник


Ответы (4)


Если я понимаю, что вы хотите сделать, тогда внутренние (проанализированные) общие сущности может помочь вам достичь того, что вы ищете.

Пример того, как вы можете определить значение «Франческо» как объект с именем «auth», а затем использовать его в своем XML:

<?xml version="1.0"?>
<!DOCTYPE doc [
  <!ENTITY auth "Francesco">
]>
<doc>
  <string name="author">&auth;</string>
  <string name="about_application">Author: &auth;</string>
</doc>

При чтении синтаксическим анализатором XML документ будет проанализирован и оценен или «увиден» как:

<?xml version="1.0"?>
<doc>
  <string name="author">Francesco</string>
  <string name="about_application">Author: Francesco</string>
</doc>
person Mads Hansen    schedule 16.09.2010
comment
Спасибо! Это хорошо работает, когда я ссылаюсь на внутренний объект из элемента xml в том же файле, в то время как у меня возникают проблемы со ссылкой на внешний объект, определенный в другом файле xml. В любом случае, я не уверен, следует ли использовать такой механизм с файлами Android /res/values/xml, я думаю, что это немного далеко от стандартного способа управления ими Android. - person Francesco Feltrinelli; 16.09.2010
comment
Это похоже на косвенность поверх косвенности :-). Проблема может быть в том, что при переводе string.xml (копирует в другие папки) вы забываете локализовать . Кроме того, каждому переводу по-прежнему нужны все строковые теги, содержащие then. Но да, это лучший вариант, потому что он должен быть статическим (поэтому файлы xml можно сделать двоичными). - person pjv; 31.03.2012

К сожалению, я не думаю, что это возможно. Недавно я задал похожий вопрос, и сказали, что это невозможно.

person Cheryl Simon    schedule 15.09.2010
comment
В любом случае, спасибо! На самом деле я также думаю, что не существует стандартного способа сделать это, даже если трюк, предложенный Мэдсом Хансеном, мог бы сработать. - person Francesco Feltrinelli; 16.09.2010

Плагин Gradle 0.10 предлагает то, что они называют manifestPlaceholders, что в основном делает то, что вам нужно, но в настоящее время эта функция работает только в AndroidManifest. Хотя открылась проблема, связанная со следующей сборкой Android версии 1.4 (1.3 в настоящее время находится в бета-версии 4, поэтому должна быть близка к RC1 и, надеюсь, вскоре появится бета-версия 1.4).

Эта проблема должна расширить заполнители в файлах конфигурации xml (Я просто молюсь, чтобы это включало файл строк, а не только базовую конфигурацию xml).

От: http://tools.android.com/tech-docs/new-build-system

Для пользовательских замен заполнителей используйте следующий DSL для настройки значений заполнителей:

android {
        defaultConfig {
            manifestPlaceholders = [ activityLabel:"defaultName"]
        }
        productFlavors {
            free {
            }
            pro {
                manifestPlaceholders = [ activityLabel:"proName" ]
            }
        }

заменит заполнитель в следующем объявлении:

<activity android:name=".MainActivity"> android:label="${activityLabel}" >

Не могу дождаться, чтобы попробовать это. Таким образом, вы можете поместить заполнитель в несколько вхождений в файл строк и определить значение только в одном месте вместо изменения всех файлов Java, чтобы добавить аргумент с %1$s

На данный момент единственным чистым решением является трюк с сущностью, но это не сработает, если вы хотите переопределить значение в ароматах, поскольку сущность должна быть определена в том же XML-файле.

person Eric Labelle    schedule 21.07.2015

Да, это возможно, я создал эту небольшую библиотеку, которая позволяет вам разрешать эти заполнители во время сборки, поэтому вам не нужно будет добавлять какой-либо код Java/Kotlin, чтобы заставить его работать.

Основываясь на вашем примере, вам нужно будет настроить свою строку следующим образом:

<string name="template_about_application">Author: ${author}</string>

А затем плагин позаботится о создании следующего:

<string name="about_application">Author: Francesco</string>

Подробнее здесь: https://github.com/LikeTheSalad/android-string-reference

person César Muñoz    schedule 24.10.2019