Android XML प्रतिशत प्रतीक


309

मेरे पास एक स्ट्रिंग है जिसमें %प्रतीक का उपयोग किया गया है। का उपयोग करने के लिए उचित प्रारूप %है %। जब मेरे पास उस सरणी में एक स्ट्रिंग होती है, तो %यह मुझे यह त्रुटि देता है।

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
क्या आप XML को पोस्ट कर सकते हैं जो इस त्रुटि का कारण है? समस्या को देखे बिना समस्या की पहचान करना बहुत मुश्किल हो सकता है।
क्रिस कैशवेल

यह एक त्रुटि है जिसे आसानी से 2 या अधिक% प्रतीकों के साथ किसी भी स्ट्रिंग द्वारा दोहराया जा सकता है।
zaid

यदि स्वरूपण उद्देश्य की तलाश नहीं है, तो पूरा करने का बेहतर तरीका है।
शिशिर गुप्ता

मेरे मामले में, मैंने गलत तरीके से फॉर्मेटिंग परम में 1% $ s के बजाय 1% $ s दर्ज किया।
अशोकचक्रवर्ती नागराजन

जवाबों:


467

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

यहां कुछ विचार दिए गए हैं कि आप अपने संसाधन स्ट्रिंग्स में% -symbol को कैसे शामिल कर सकते हैं।

यदि आपको अपने स्ट्रिंग में किसी भी प्रारूप विनिर्देशक या प्रतिस्थापन की आवश्यकता नहीं है, तो आप केवल formattedविशेषता का उपयोग कर सकते हैं और इसे falseनिम्न पर सेट कर सकते हैं :

<string formatted="false">%a + %a == 2%a</string>

इस स्थिति में स्ट्रिंग का उपयोग प्रारूप स्ट्रिंग के रूप में नहीं किया जाता है, Formatterइसलिए आपको अपने% -symbols से बचने की आवश्यकता नहीं है। परिणामस्वरूप स्ट्रिंग "% a +% a == 2% a" है।

यदि आप formatted="false"विशेषता को छोड़ देते हैं , तो स्ट्रिंग का उपयोग प्रारूप स्ट्रिंग के रूप में किया जाता है और आपको% -symbols से बचना होगा। यह सही ढंग से दोहरे% के साथ किया जाता है:

<string>%%a + %%a == 2%%a</string>

अब aaptआपको कोई त्रुटि नहीं देता है लेकिन आप इसका उपयोग कैसे करते हैं इसके आधार पर, परिणामी स्ट्रिंग "%% a + %% a == 2 %% a" हो सकती है यदि कोई Formatterबिना किसी प्रारूप के तर्क के लागू किया जाता है :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

किसी भी xml और कोड के बिना यह कहना मुश्किल है कि वास्तव में आपकी समस्या क्या है, लेकिन उम्मीद है कि यह आपको तंत्र को थोड़ा बेहतर समझने में मदद करता है।


1
मैंने इसे उत्तर के रूप में चुना क्योंकि यह काम करना चाहिए, लेकिन स्पष्ट रूप से एक बग है जो उस स्ट्रिंग के साथ चल रहा है, इसलिए ive ने %% और "XXX.replaceAll (" %% ","% ") का उपयोग करने का निर्णय लिया;
ज़ेड

4
का उपयोग कर स्वरूपित = false काम करता है अच्छी तरह से। इस तरह से मैंने इसका उपयोग किया: <string name = "information_description" स्वरूपित = "झूठा"> \ 'Sweet \' 10% से 20% यहां तक ​​कि वजन से 35% चीनी </ string>
कहीं

1
स्वरूपित = झूठ मेरे लिए भी अच्छा काम करता है। %% का उपयोग करते हुए, यह शाब्दिक रूप से मेरे उपकरण और एमुलेटर पर %% के रूप में दिखाई दिया ..
नमूना लें

स्वरूपित = गलत मेरे लिए अतीत में ठीक काम किया। अब (ADT 22), किसी कारण से यह नहीं है। और अगर मैं उपयोग करता हूं: "str = mContext.getString (R.string.str," hello ")", तो यह यह संकेत चेतावनी देगा: "स्वरूप स्ट्रिंग 'str' एक वैध प्रारूप स्ट्रिंग नहीं है, इसलिए इसे पारित नहीं किया जाना चाहिए। String.format "
एंड्रॉइड डेवलपर

1
यदि आप <string-array /> से एक्सेस कर रहे हैं, तो प्रिटिंग प्रतिशत के लिए \ u0025 का उपयोग करें। इसने मेरे लिए काम किया।
चिंतन शाह

157

एप्लिकेशन को संसाधनों से स्वरूपित स्ट्रिंग्स का उपयोग करने की अनुमति देने के लिए आपको अपना xml सही करना चाहिए। इसलिए, उदाहरण के लिए

<string name="app_name">Your App name, ver.%d</string>

के साथ प्रतिस्थापित किया जाना चाहिए

<string name="app_name">Your App name, ver.%1$d</string>

आप देख सकते हैं इस जानकारी के लिए।


2
धन्यवाद, आपने लापता लिंक प्रदान किया है - शाब्दिक रूप से।
अनूपपुरी

22
कई पैरामीटर प्रतिस्थापन (जैसे तार के साथ), उपयोग %1$s, %2$sआदि के लिए
CJBS

1
इस छोटी सी बात के लिए इतना बड़ा जवाब कौन पढ़ेगा? धन्यवाद, मैं आपको खोजने के लिए नीचे स्क्रॉल करता हूं।
जनक आर राजपक्ष

73

आप XML पार्सर के लिए %% का उपयोग करके% से बच सकते हैं, लेकिन यह डिवाइस में दो बार दिखाया गया है।

इसे एक बार दिखाने के लिए, निम्न प्रारूप आज़माएँ: \%%

उदाहरण के लिए

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

Fat Burning (50% to 60%)डिवाइस के रूप में दिखाया गया है


6
Nexus 4 4.2.1 पर \ %% क्रैश का कारण बनता है। दूसरों का परीक्षण नहीं किया।
जॉन विलिस

यह अच्छी तरह से काम करता है और आसान है जब आप पहले से ही प्रतिशत जानते हैं जिसे आप अपने स्ट्रिंग्स में शामिल करना चाहते हैं, बनाम स्ट्रिंग सूत्र का उपयोग करके और हमेशा उन हार्डकोड मानों को प्रोग्रामेटिक रूप से सेट करने के लिए।
portfoliobuilder

यह मेरे लिए नेक्सस 5.1.1 पर दुर्घटनाग्रस्त हो गया। @ विलियस उत्तर सही है।
जिंग होंग

2
केवल%% का उपयोग करें
Sundeep1501

37

उपयोग

<string name="win_percentage">%d%% wins</string>

लेना

80% wins एक स्वरूपित स्ट्रिंग के रूप में।

मैं String.format()नंबर का उपयोग करने के बजाय डालने के लिए विधि का उपयोग कर रहा हूं %d


12

अपनी स्ट्रिंग्स.xml फ़ाइल में आप अपनी इच्छानुसार किसी भी यूनिकोड चिह्न का उपयोग कर सकते हैं।

उदाहरण के लिए, प्रतिशत चिह्न के लिए यूनिकोड संख्या 0025 है:

<string name="percent_sign">&#x0025;</string>

आप यहां यूनिकोड संकेतों की एक व्यापक सूची देख सकते हैं


1
उसका कोई मतलब नहीं है। & # x0025; और% xml फ़ाइल में समान हैं।
बेनीबेला

संसाधन फ़ाइल जावा संसाधन में बदल जाती है, और ऐसा करने पर, %चरित्र वापस आ जाता है। मुझे डर है कि इससे समस्या हल नहीं होती।
पॉल लामर्ट्समा

9

प्रतिशत प्रतीक से बचने के लिए, आपको बस %% की आवश्यकता है

उदाहरण के लिए :

String.format("%1$d%%", 10)

"10%" लौटाता है


1
आपका उत्तर कई अन्य मौजूदा उत्तरों के समान ही है
बेन राइस-लुईस

... और गलत, क्योंकि रिटर्न 10%नहीं %10। FIY: जब आप उपयोग करते हैं String.formatतो आपको हर बार लोकेल निर्दिष्ट करनी चाहिए। जब आप लोकेल नहीं
लगाते हैं

7

बिल्कुल आपकी समस्या नहीं बल्कि एक जैसी।

यदि आपकी स्ट्रिंग प्रविष्टि में एक से अधिक स्वरूपण हैं, तो आपको कई बार "% s" का उपयोग नहीं करना चाहिए।

न करें:

<string name="entry">Planned time %s - %s (%s)</string>

करना :

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

आप %% के साथ xml में% से बच सकते हैं, लेकिन आपको कोड में पाठ सेट करने की आवश्यकता है, लेआउट xml में नहीं।


1
हाँ, यह डबल% के साथ बच जाता है, और अच्छी तरह से संकलित करता है। लेकिन जब एमुलेटर, या यहां तक ​​कि उपकरणों पर चलाया जाता है, तो यह %% के रूप में दिखाई दे सकता है।
samwize

5

यह आईडीई के सख्त होने का मामला हो सकता है।

विचार ध्वनि है, सामान्य तौर पर आपको प्रतिस्थापन चर के आदेश को निर्दिष्ट करना चाहिए ताकि आपको किसी अन्य भाषा के लिए संसाधन जोड़ना चाहिए, आपके जावा कोड को बदलने की आवश्यकता नहीं होगी। हालाँकि इसके साथ दो मुद्दे हैं:

सबसे पहले, एक स्ट्रिंग जैसे:

You will need %.5G %s

के रूप में इस्तेमाल किया जा करने के लिए आप की आवश्यकता होगी।

दूसरा यह है कि यदि आप चर का क्रम उस भाषा में डालते हैं जिसमें कभी आपके डिफ़ॉल्ट संसाधनों को निर्दिष्ट किया जाता है (जैसे अंग्रेजी) तो आपको केवल भाषा के लिए संसाधन स्ट्रिंग्स में पदों को निर्दिष्ट करने की आवश्यकता है जो आपकी डिफ़ॉल्ट भाषा के लिए एक अलग क्रम का उपयोग करते हैं।

अच्छी खबर यह है कि यह ठीक करने के लिए सरल है। भले ही पदों को निर्दिष्ट करने की कोई आवश्यकता नहीं है, और आईडीई अत्यधिक सख्त है, बस उन्हें वैसे भी निर्दिष्ट करें। ऊपर दिए गए उदाहरण के लिए:

आपको% 1 $ .5G% 2 $ s की आवश्यकता होगी



3

इस एक (सही) का प्रयास करें:

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

मान लीजिए कि आप (50% OFF) दिखाना चाहते हैं और रनटाइम में 50 दर्ज करें। यहाँ कोड है:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

जावा वर्ग में इस कोड का उपयोग करें:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

-16

इसके सामने एक बैकस्लैश का उपयोग करने का प्रयास करें, जैसे नीचे:

\%

यह समाधान दुर्घटनाग्रस्त हो जाता है।
प्रिंकल कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.