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-файле.