2010-09-15 28 views
8

我想知道是否有辦法將XML文件中定義的<string>元素插入到另一個<string>元素中,只需使用XML即可。Android:如何將<string>元素注入到XML中的另一個<string>元素中?

例如,我可以有:

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

,我期待這樣的事情:

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

使getString(R.string.about_application)會導致 「作者:弗朗西斯」。

我知道我可以使用String.format(string, formatArgs)例如像在Java代碼中的兩個要素結合起來:

<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的「標準」管理方式有一點距離。 – 2010-09-16 09:55:52

+2

這就像在間接方向上的間接尋址:-)。問題可能在於翻譯string.xml(其他文件夾中的副本)時,您忘記本地化&auth;。此外,每個翻譯仍然需要包含&auth;的所有字符串標記。但是,這是最好的,因爲它必須是靜態的(所以xml文件可以變成二進制文件)。 – pjv 2012-03-31 17:35:11

1

不幸的是我不認爲這是可能的。前一段時間我問了一個similar question,並被告知這是不可能的。

+0

謝謝!其實我也認爲,即使Mads Hansen提出的「竅門」可以完成這項工作,也沒有標準的方法去做。 – 2010-09-16 09:58:03

0

搖籃插件0.10帶來了他們所謂的manifestPlaceholders基本上做你所需要的,但該功能目前只工作在AndroidManifest。儘管an issue opened targeting the next Android build version 1.41.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的參數。

現在唯一干淨的解決方案是實體技巧,但如果你想覆蓋flavor中的值,這將不起作用,因爲實體必須在同一個xml文件中定義。

相關問題