Android: как вставить элемент в другой элемент в 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), например:

<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.

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

3 ответов


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

пример того, как вы можете определить значение "Francesco" как сущность под названием "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>

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


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

эта проблема должна расширить заполнители в файлах конфигураций 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-файле.