2010-09-15 7 views
8

मैं जानना चाहता हूं कि <string> तत्व को किसी XML फ़ाइल में परिभाषित तत्व को <string> तत्व में डालने का तरीका है, जो कि एक्सएमएल के साथ ऐसा कर रहा है।एंड्रॉइड: एक्सएमएल में <string> तत्व में <string> तत्व इंजेक्ट कैसे करें?

उदाहरण के लिए मैं हो सकता है:

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

और मैं की तरह कुछ के लिए देख रहा हूँ:

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

ताकि getString(R.string.about_application) में ": फ्रांसेस्को लेखक" होगी।

मुझे पता है कि मैं जावा कोड में दो तत्वों 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 फ़ाइल में परिभाषित बाहरी इकाई को संदर्भित करने में समस्याएं आ रही हैं। वैसे भी, मुझे यकीन नहीं है कि इस तरह के तंत्र का उपयोग एंड्रॉइड/रेज/वैल्यू/एक्सएमएल फाइलों के साथ किया जाना चाहिए, मुझे लगता है कि यह उन्हें प्रबंधित करने के एंड्रॉइड "मानक" तरीके से थोड़ा दूर है। –

+2

यह संकेत के शीर्ष पर एक संकेत की तरह है :-)। समस्या यह हो सकती है कि string.xml (अन्य फ़ोल्डर्स में प्रतियां) का अनुवाद करते समय, आप &auth; को स्थानीयकृत करना भूल जाते हैं। इसके अलावा, प्रत्येक अनुवाद को तब भी सभी स्ट्रिंग टैग की आवश्यकता होती है जिसमें &auth; होता है। लेकिन हाँ, यह सबसे अच्छा संभव है क्योंकि इसे स्थैतिक होना चाहिए (इसलिए एक्सएमएल फाइलों को बाइनरी बनाया जा सकता है)। – pjv

1

दुर्भाग्य से मुझे नहीं लगता कि यह संभव है। मैंने थोड़ी देर पहले similar question से पूछा, और कहा गया कि यह संभव नहीं था।

+0

वैसे भी धन्यवाद! दरअसल मैं यह भी सोचता हूं कि ऐसा करने का कोई मानक तरीका नहीं है, भले ही "चाल" मैड्स हैंनसेन ने नौकरी कर सकें। –

0

Gradle प्लगइन 0.10 वे क्या manifestPlaceholders जो मूल रूप से आपको क्या चाहिए करता है लेकिन AndroidManifest में वर्तमान में यह सुविधा केवल काम फोन लाता है। हालांकि an issue opened targeting the next Android build version 1.4 (1.3 वर्तमान में बीटा 4 में है इसलिए आरसी 1 के पास होना चाहिए और जल्द ही 1.4 बीटा 1 देख सकता है)

इस समस्या को प्लेसहोल्डर्स को एक्सएमएल कॉन्फ़िगरेशन फाइलों में विस्तारित करना चाहिए (मैं अभी प्रार्थना करता हूं कि इसमें स्ट्रिंग्स फ़ाइल शामिल होगी और न केवल मूल xml कॉन्फ़िगरेशन)।

से: http://tools.android.com/tech-docs/new-build-system

कस्टम प्लेसहोल्डर प्रतिस्थापन के लिए, कॉन्फ़िगर करने के लिए निम्न डीएसएल का उपयोग प्लेसहोल्डर मान:

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

निम्नलिखित घोषणा में प्लेसहोल्डर विकल्प होगा :

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

इसे आज़माने के लिए प्रतीक्षा नहीं कर सकते। इस तरह आप स्ट्रिंग्स फ़ाइल में एकाधिक अवसरों में प्लेसहोल्डर डाल सकते हैं और% 1 $ s

के साथ तर्क जोड़ने के लिए सभी जावा फ़ाइलों को संशोधित करने के बजाय केवल एक स्थान पर मान को परिभाषित कर सकते हैं, क्योंकि अब केवल एकमात्र साफ समाधान है इकाई चाल लेकिन यह काम नहीं करेगा यदि आप स्वाद में मान को ओवरराइड करना चाहते हैं क्योंकि इकाई को उसी XML फ़ाइल में परिभाषित किया जाना चाहिए।