2016-02-08 12 views
9

के निर्माण के दौरान स्ट्रिंग्स.एक्सएमएल की सामग्री बदलें, मैं अपने सीएमएस (या कुछ डीबी) से res/values ​​/ strings.xml से उपयोगकर्ता-दृश्य स्ट्रिंग्स का मूल्य लोड करने में सक्षम होना चाहता हूं। धीरे-धीरे निर्माण।एंड्रॉइड ग्रेडल बिल्ड में,

उदा।

<string name="button_label">OK, do it</string> 

<string name="button_label">OK, do it now!</string> 

... या जो कुछ भी बदला जा सकता है।

यह विचार यह है कि नया मूल्य हमारे सीएमएस से निर्मित समय पर पढ़ा जाएगा, और फिर एपीके फ़ाइल में बेक्ड हो जाएगा। (प्रेरणा ऐप तारों में परिवर्तन स्वचालित करने के लिए है, ताकि ऐप से कोई भी पाठ मौजूदा सीएमएस से पढ़ा जा सके)।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? एंड्रॉइड बिल्ड सिस्टम द्वारा उपयोग किए जाने से ठीक पहले, निर्माण फ़ाइलों के दौरान संसाधन फ़ाइलों (उदा। स्ट्रिंग्स.एक्सएमएल) को उत्पन्न/संशोधित करना संभव है?


जोड़ा जा रहा है कुछ और आवश्यकताओं:

  • समाधान, "वैकल्पिक संसाधन" का समर्थन करने के अन्य भाषाओं के लिए तार अधिभावी उर्फ ​​जरूरत है। (http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources)
  • समाधान मूल (डिफ़ॉल्ट) strings.xml फ़ाइल में मौजूद मानों को ओवरराइड करने में सक्षम होना चाहिए।
+1

आसान तरीका: http://tools.android.com/tech-docs/new-build-system variant.resValue ... अन्य: खुद का ग्रेडल प्लगइन बनाएं ... – Selvin

+0

धन्यवाद सेल्विन, जो आशाजनक दिखता है। हालांकि इसके बारे में एक सवाल: मैं अलग-अलग भाषाओं के लिए फ़ॉलबैक मूल्य प्रदान करने के बारे में कैसे जाऊं? क्या यह इस समारोह के साथ संभव है? – treesAreEverywhere

+0

'applicationVariants.all {variant -> variant.resValue" string "," button_xxx "," यहां टेक्स्ट जाता है "} '... निश्चित रूप से आपको कुछ ग्रोवी मूल बातें सीखने की आवश्यकता है (उदाहरण के लिए उन मानों को ऑनलाइन या उससे प्राप्त करने के लिए आपकी विशिष्ट xml/json फ़ाइल) ... fx https://gist.github.com/SelvinPL/f89476b6585690cb252b ... मैं इसे fx 'colorPrimaryAX' उत्पन्न करने के लिए उपयोग करता हूं जो x% अल्फा https: //gist.github के साथ रंग है .com/सेल्विनपीएल/8e673e38c5fed8e2132b – Selvin

उत्तर

3

यहां एक समाधान है जहां आपके तारों को बाहरी गुण फ़ाइल के माध्यम से संशोधित किया जाता है। सुनिश्चित नहीं है कि यह आपकी आवश्यकता को ठीक से फिट करता है, लेकिन इसे आपको शुरुआत में ले जाना चाहिए।

मैं अपने निर्माण में कुछ ऐसा करता हूं - मेरे पास doFirst() के अंदर बुलाए गए इस प्रकार के प्रतिस्थापन के साथ कुछ कस्टम ग्रेडल कार्य हैं। यहां रेगेक्स शायद कुछ पॉलिशिंग का उपयोग कर सकता है, और इनपुट प्रारूप आपकी आवश्यकता के अनुसार बदल सकता है, लेकिन कुछ स्थानीय परीक्षणों में यह मेरे लिए काम करता प्रतीत होता है।

ext.updateStrings = { 
println("Changing strings!") 
Properties props = new Properties() 
props.load(new FileInputStream(file('cms.properties'))) 
def stringsFile = file("src/main/res/values/strings.xml") 
def stringsText = stringsFile.getText() 
for (p in props) { 
    def pattern = Pattern.compile(String.format("%s\">.*<", p.key)); 
    def match = pattern.matcher(stringsText); 
    match.find(); 
    println("found key " + p.key + ", replacing string with " + p.value) 
    stringsText = match.replaceAll(String.format("%s\">%s<", p.key, p.value)) 
    stringsFile.write(stringsText) 
    } 
} 

मैं अपनी बाहरी गुण/फ़ंक्शंस को एक अलग फ़ाइल में रखता हूं (उदाहरण के लिए common.gradle)। अपने build.gradle में, आप तो जैसे एक कस्टम कार्य जोड़ सकते हैं:

apply from: "common.gradle" 
task updateStringsXml() { 
    doFirst { 
     updateStrings() 
    } 
} 

फिर, अपने Gradle आदेश gradle updateStringsXml assembleRelease कैसा लग सकता है।

+0

दिलचस्प हिस्सा है ... आप इसे बिल्ड प्रक्रिया में कैसे एकीकृत करते हैं, भले ही आपके पास अलग-अलग स्वाद/बिल्ड प्रकार हैं, साथ ही भाषा ओवरराइड भी हैं? – treesAreEverywhere

+0

मेरे संपादन को देखें - स्वाद/निर्माण प्रकारों के लिए, आप आसानी से प्रोजेक्ट गुण जोड़ सकते हैं और इस तरह से अपने तारों को सशर्त रूप से बदल सकते हैं। मैं उन्हें [यहां] के रूप में उपयोग करना पसंद करता हूं (http://stackoverflow.com/questions/11696521/how-to-pass-arguments-from-command-line-to-gradle)। भाषाओं के साथ ही, आपके "cms.properties" में आपको जो भी भाषा पसंद हो सकती है। – lase

संबंधित मुद्दे