2010-09-15 2 views
8

Я хотел бы знать, есть ли способ вставить/вставить элемент , определенный в файле XML, в другой элемент <string>, делая это только с XML.Android: Как вставить элемент <string> в другой <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 непосредственно.

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

ответ

14

Если я понимаю, что вы ищете, то internal (parsed) general entities может помочь вам достичь того, что вы ищете.

Пример того, как можно определить значение «Франческо» в качестве организации под названием «аутентификации», а затем использовать его в 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> 
+0

Спасибо! Он хорошо работает, когда я ссылаюсь на внутренний объект из элемента xml в том же файле, в то время как у меня возникают проблемы с ссылкой на внешний объект, определенный в другом XML-файле. Во всяком случае, я не уверен, должен ли этот механизм использоваться с файлами Android/res/values ​​/ xml, я думаю, что он немного далек от «стандартного» способа Android управлять ими. –

+2

Это похоже на косвенную направленность сверху :-). Проблема может заключаться в том, что при переводе string.xml (копии в другие папки) вы забыли локализовать &auth;. Кроме того, каждый перевод по-прежнему нуждается во всех строковых тегах, содержащих &auth;. Но да, это лучше всего, потому что оно должно быть статическим (поэтому файлы xml можно сделать двоичными). – pjv

1

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

+0

Спасибо вам! На самом деле я также думаю, что нет стандартного способа сделать это, даже если «трюк» Мэдс Хансен предложил сделать эту работу. –

0

Gradle плагин 0.10 приносит то, что они называют manifestPlaceholders, который в основном делает то, что вам нужно, но эта функция в настоящее время работают только в AndroidManifest. Существует, хотя an issue opened targeting the next Android build version 1.4 (1,3 в настоящее время находится в beta4, поэтому должен быть рядом с RC1 и вскоре можно увидеть 1.4 beta1).

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

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

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

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

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

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

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

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