क्या स्ट्रिंग मानों में प्लेसहोल्डर्स होना संभव है जो string.xml
रन टाइम में मान असाइन किए जा सकते हैं?
उदाहरण:
कुछ स्ट्रिंग PLACEHOLDER1 कुछ और स्ट्रिंग
क्या स्ट्रिंग मानों में प्लेसहोल्डर्स होना संभव है जो string.xml
रन टाइम में मान असाइन किए जा सकते हैं?
उदाहरण:
कुछ स्ट्रिंग PLACEHOLDER1 कुछ और स्ट्रिंग
जवाबों:
हाँ, स्ट्रिंग संसाधन से निम्नलिखित देखें : स्वरूपण और स्टाइलिंग
यदि आपको अपने तार का उपयोग करने की आवश्यकता है
String.format(String, Object...)
, तो आप स्ट्रिंग संसाधन में अपने प्रारूप तर्क डालकर ऐसा कर सकते हैं। उदाहरण के लिए, निम्नलिखित संसाधन के साथ:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
इस उदाहरण में, प्रारूप स्ट्रिंग के दो तर्क हैं:
%1$s
एक स्ट्रिंग है और%2$d
एक दशमलव संख्या है। आप इस तरह अपने आवेदन से तर्क के साथ स्ट्रिंग प्रारूपित कर सकते हैं:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
ध्यान दें कि getString
एक अधिभार है जो स्ट्रिंग को प्रारूप स्ट्रिंग के रूप में उपयोग करता है:
String text = res.getString(R.string.welcome_messages, username, mailCount);
यदि आपको प्लुरल को संभालने की आवश्यकता है, तो इसका उपयोग करें:
<plurals name="welcome_messages">
<item quantity="one">Hello, %1$s! You have a new message.</item>
<item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>
पहला mailCount
परम का उपयोग यह तय करने के लिए किया जाता है कि कौन सा प्रारूप (एकल या बहुवचन) का उपयोग करना है, अन्य पैराम आपके प्रतिस्थापन हैं:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
स्ट्रिंग संसाधन देखें : अधिक जानकारी के लिए प्लुरल ।
जब मैंने पहली बार देखा %1$s
और %2$d
स्वीकार किए गए उत्तर में, इसका कोई मतलब नहीं था। यहाँ थोड़ा और स्पष्टीकरण दिया गया है।
उन्हें प्रारूप विनिर्देशक कहा जाता है। Xml स्ट्रिंग में वे के रूप में हैं
%[parameter_index$][format_type]
1$
, 2$
और 3$
। आप उन्हें संसाधन स्ट्रिंग में रखने वाले आदेश से कोई फर्क नहीं पड़ता, केवल वह क्रम जो आप मापदंडों की आपूर्ति करते हैं।प्रारूप प्रकार : बहुत सारे तरीके हैं जिनसे आप चीजों को प्रारूपित कर सकते हैं ( प्रलेखन देखें )। यहाँ कुछ सामान्य हैं:
s
तारd
दशमलव पूर्णांकf
चल बिन्दु संख्याहम निम्न स्वरूपित स्ट्रिंग बनाएंगे जहां ग्रे भागों को प्रोग्रामेटिक रूप से डाला जाता है।
मेरी बहन
Mary
है12
वर्ष।
string.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
MyActivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
getString
था क्योंकि मैं एक गतिविधि में था। आप उपयोग कर सकते हैंcontext.getResources().getString(...)
यदि यह उपलब्ध नहीं है तो ।String.format()
एक स्ट्रिंग को भी प्रारूपित करेगा।1$
और 2$
शर्तों है कि आदेश में इस्तेमाल किया जा की जरूरत नहीं है। यानी 2$
पहले भी आ सकता है 1$
। यह उपयोगी है जब भाषाओं के लिए एक ऐप का अंतर्राष्ट्रीयकरण किया जाता है जो एक अलग शब्द क्रम का उपयोग करता है।%1$s
यदि आप इसे दोहराना चाहते हैं तो आप xml में एक से अधिक बार निर्दिष्ट प्रारूप का उपयोग कर सकते हैं ।%%
वास्तविक %
चरित्र प्राप्त करने के लिए उपयोग करें ।जब आप किसी जावा कोड का उपयोग किए बिना वास्तविक स्ट्रिंग्स.एक्सएमएल फ़ाइल से एक पैरामीटर का उपयोग करना चाहते हैं:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY appname "WhereDat">
<!ENTITY author "Oded">
]>
<resources>
<string name="app_name">&appname;</string>
<string name="description">The &appname; app was created by &author;</string>
</resources>
यह संसाधन फ़ाइलों पर काम नहीं करता है, अर्थात चर को उन प्रत्येक XML फ़ाइल में कॉपी किया जाना चाहिए जिनकी उन्हें आवश्यकता है।
<!DOCTYPE... ]>
अलग फ़ाइल में भाग को परिभाषित करने और इसे कई संसाधन फ़ाइलों में शामिल करने का कोई तरीका है ? इसे हासिल करने की कोई तरकीब?
उसी की तलाश में था और अंत में निम्नलिखित बहुत ही सरल समाधान मिला। सर्वश्रेष्ठ: यह बॉक्स से बाहर काम करता है।
1. अपने स्ट्रिंग रेज़र को बदलें:
<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have
<xliff:g name="count">%d</xliff:g> new messages.</string>
2. स्ट्रिंग प्रतिस्थापन का उपयोग करें:
c.getString(R.string.welcome_messages,name,count);
जहां c कॉन्सेप्ट है, नाम एक स्ट्रिंग वेरिएबल है और अपने इंट वेरिएबल को गिना है
आपको शामिल करने की आवश्यकता होगी
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
अपने Res / strings.xml में। मेरे लिये कार्य करता है। :)
xliff
प्रारूप निर्दिष्टकर्ताओं के आसपास के टैग का क्या मतलब है ? क्या अतिरिक्त मूल्य वे सिर्फ अपने दम पर %s
और %d
विनिर्देशक के उपयोग के विपरीत जोड़ते हैं?
कोटलिन में आपको अपना स्ट्रिंग मान इस तरह सेट करना होगा:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
अपने लेआउट पर एक टेक्स्ट दृश्य बनाएं:
<TextView android:id="@+id/song_number_and_title"/>
यदि आप Anko का उपयोग कर रहे हैं तो अपने कोड में ऐसा करें:
val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))
आपको आवेदन संदर्भ से अपने संसाधन प्राप्त करने की आवश्यकता हो सकती है।
हालाँकि, आपको “शून्य” के एंड्रॉइड प्लूरल उपचार पर एलियास मैर्टेंसन के उत्तर को भी पढ़ना चाहिए । "शून्य" जैसे कुछ मूल्यों की व्याख्या के साथ एक समस्या है।
Res / मान / string.xml में
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
जावा कोड में
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
आप उपयोग कर सकते हैं MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
जावा कोड में:
String text = MessageFormat(R.string.customer_address).format("Name","Family");
एपीआई स्तर 1:
https://developer.android.com/reference/java/text/MessageFormat.html
यदि आप प्रतिशत (%) लिखना चाहते हैं, तो उसे डुप्लिकेट करें:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
यदि आप सरलता से लिखते हैं %1$d%
, तो आपको त्रुटि मिलेगी Format string 'percent' is not a valid format string so it should not be passed to String.format
:।
हाँ! आप किसी भी जावा / कोटलिन कोड को लिखे बिना ऐसा कर सकते हैं, केवल XML जो मैंने बनाई इस छोटी सी लाइब्रेरी का उपयोग करके, जो बिल्डटाइम पर ऐसा करता है, इसलिए आपका ऐप इससे प्रभावित नहीं होगा: https://github.com/LikeTheSalad/android -string-संदर्भ
प्रयोग
आपके तार:
<resources>
<string name="app_name">My App Name</string>
<string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>
निर्माण के बाद उत्पन्न स्ट्रिंग:
<!--resolved.xml-->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
समस्या के लिए एक प्रत्यक्ष कोटलिन समाधान:
strings.xml
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
kotlinActivityORFragmentFile.kt:
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
अपनी स्ट्रिंग फ़ाइल में इसका उपयोग करें
<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>
और उसी के अनुसार अपने कोड का उपयोग करें
coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
, rewardPoints.getConversion_rate(), getString(R.string.rs)));
स्वीकृत उत्तर के कोटलिन संस्करण ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
resources.getString(int, ... args)
इसके बजाय तर्कों के साथ विधि का उपयोग करना है String.format
। इस कोड में कोई कोटलिन विशिष्टता नहीं है, अन्य तब val
कीवर्ड। Msbodw001 का उत्तर देखें