क्या एंड्रॉइड में स्ट्रिंग को String.xml से जोड़ना संभव है?


494

क्या स्ट्रिंग मानों में प्लेसहोल्डर्स होना संभव है जो string.xmlरन टाइम में मान असाइन किए जा सकते हैं?

उदाहरण:

कुछ स्ट्रिंग PLACEHOLDER1 कुछ और स्ट्रिंग



@ हर्षग्यानी नहीं, यह एक पुराना है, कि एक को इसके बजाय मर्ज किया जाना चाहिए
दान

जवाबों:


1033

स्वरूपण और स्टाइलिंग

हाँ, स्ट्रिंग संसाधन से निम्नलिखित देखें : स्वरूपण और स्टाइलिंग

यदि आपको अपने तार का उपयोग करने की आवश्यकता है 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);

स्ट्रिंग संसाधन देखें : अधिक जानकारी के लिए प्लुरल


61
पहले कोड नमूने में String.format कॉल वास्तव में आवश्यक नहीं है, Resources.getString () स्वरूपण का समर्थन करता है, देखें: developer.android.com/reference/android/content/res/… , java.lang.Object ...
अरनौद

16
String.xml में Plurals के लिए आपको R.plurals.welcome_messages के रूप में R.string.welcome_messages के रूप में आईडी देने की आवश्यकता है
om252345

केवल अंतिम आइटम स्ट्रिंग पर लौटने वाली बहुवचन चीज ... कोई भी विचार कैसे एपेंड स्ट्रिंग प्राप्त कर सकता है।
CoDe

1
अपनी स्ट्रिंग को प्रारूपित करने के लिए इस पद्धति का उपयोग करते समय, इसने आपके द्वारा हाइपरलिंक्स आदि जैसे किसी भी मेटा टैग को हटा दिया है जो कि xml स्ट्रिंग पाठ में शामिल हो सकता है
जोनाथन

4
स्ट्रिंग% 1 $ s के लिए है,% 2 $ d और पूर्णांक के लिए दशमलव क्या है? % 1 का अर्थ क्या है,% 2. क्या यह पैरामीटर की गिनती है? यदि मुझे तीसरा पैरामीटर चाहिए तो% 3 का उल्लेख है?
रीगन

259

अनुपूरक उत्तर

जब मैंने पहली बार देखा %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 में एक से अधिक बार निर्दिष्ट प्रारूप का उपयोग कर सकते हैं ।
  • %%वास्तविक %चरित्र प्राप्त करने के लिए उपयोग करें ।
  • अधिक जानकारी के लिए निम्नलिखित सहायक ट्यूटोरियल पढ़ें: एंड्रॉइड एसडीके क्विक टिप: फ़ॉर्मेटिंग रिसोर्स स्ट्रिंग्स

125

जब आप किसी जावा कोड का उपयोग किए बिना वास्तविक स्ट्रिंग्स.एक्सएमएल फ़ाइल से एक पैरामीटर का उपयोग करना चाहते हैं:

<?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 फ़ाइल में कॉपी किया जाना चाहिए जिनकी उन्हें आवश्यकता है।


जब आप के अंदर एक पैरामीटर हो तो सिवाय एक अच्छा जवाब <! [CDATA [& param; ]]>
हरमन पोइलपेयर

2
क्या किसी <!DOCTYPE... ]>अलग फ़ाइल में भाग को परिभाषित करने और इसे कई संसाधन फ़ाइलों में शामिल करने का कोई तरीका है ? इसे हासिल करने की कोई तरकीब?
prom85

18

उसी की तलाश में था और अंत में निम्नलिखित बहुत ही सरल समाधान मिला। सर्वश्रेष्ठ: यह बॉक्स से बाहर काम करता है।
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 में। मेरे लिये कार्य करता है। :)


2
xliffप्रारूप निर्दिष्टकर्ताओं के आसपास के टैग का क्या मतलब है ? क्या अतिरिक्त मूल्य वे सिर्फ अपने दम पर %sऔर %dविनिर्देशक के उपयोग के विपरीत जोड़ते हैं?
रिचर्ड ले मेसियर

Xliff टैग में "नाम" विशेषता अनुवादक को संकेत देने का एक तरीका है कि वहाँ क्या प्रतिस्थापित किया जाएगा। कभी-कभी यह अनुमान लगाना आसान नहीं होता है कि "% s" का क्या अर्थ है।
हुगोमग

3

कोटलिन में आपको अपना स्ट्रिंग मान इस तरह सेट करना होगा:

<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))  

आपको आवेदन संदर्भ से अपने संसाधन प्राप्त करने की आवश्यकता हो सकती है।


5
कैसे है कि जावा उदाहरण से अलग है? मुझे कोई अंतर नहीं दिखाई देता
Janusz Hain


1

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);


1

यदि आप प्रतिशत (%) लिखना चाहते हैं, तो उसे डुप्लिकेट करें:

<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:।


0

हाँ! आप किसी भी जावा / कोटलिन कोड को लिखे बिना ऐसा कर सकते हैं, केवल 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>

0

समस्या के लिए एक प्रत्यक्ष कोटलिन समाधान:

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 )

0

अपनी स्ट्रिंग फ़ाइल में इसका उपयोग करें

<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)));

-1

स्वीकृत उत्तर के कोटलिन संस्करण ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)

3
अधिक सही तरीका resources.getString(int, ... args)इसके बजाय तर्कों के साथ विधि का उपयोग करना है String.format। इस कोड में कोई कोटलिन विशिष्टता नहीं है, अन्य तब valकीवर्ड। Msbodw001 का उत्तर देखें
dant3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.