Android TextView: "सेटटेक्स्ट के साथ प्रदर्शित पाठ को न बदलें"


136

मैं निम्नलिखित तरीके से सेट टेक्स्ट () का उपयोग करके पाठ सेट कर रहा हूं ।

prodNameView.setText("" + name);

prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));

उस पहले में एक सरल उपयोग है और दूसरा एक पाठ स्वरूपण के साथ पाठ सेट कर रहा है।

एंड्रॉइड स्टूडियो इतना दिलचस्प है, मैंने मेनू का उपयोग किया Analyze -> Code Cleanupऔर मुझे दो लाइनों के ऊपर सुझाव मिला जैसे।

यहाँ छवि विवरण दर्ज करें

सेटटेक्स्ट के साथ प्रदर्शित पाठ को न बदलें। प्लेसहोल्डर्स के साथ संसाधन स्ट्रिंग का उपयोग करें। कम ... (Ctrl + F1)

TextView # setText पर कॉल करते समय:

  • कभी भी नंबर # toString () को फॉर्मेट नंबर पर न करें; यह अंश विभाजकों और स्थानीय-विशिष्ट अंकों को ठीक से नहीं संभालेगा। इसके बजाय उचित प्रारूप विनिर्देशों (% d या% f) के साथ स्ट्रिंग # प्रारूप का उपयोग करने पर विचार करें।
  • पाठ प्रदर्शित करने के लिए एक स्ट्रिंग शाब्दिक (जैसे "हैलो") पास न करें। हार्डकोड टेक्स्ट को अन्य भाषाओं में ठीक से अनुवाद नहीं किया जा सकता है। इसके बजाय एंड्रॉइड संसाधन स्ट्रिंग्स का उपयोग करने पर विचार करें।
  • पाठ विखंडन करके संदेशों का निर्माण न करें। ऐसे संदेशों का ठीक से अनुवाद नहीं किया जा सकता है।

इसके लिए मैं क्या कर सकता हूं? कोई भी यह समझाने में मदद कर सकता है कि बात क्या है और मुझे क्या करना चाहिए?


1
इसका मतलब है कि आपको केवल एक Stringमें उत्तीर्ण होना चाहिए setText()। Ex: setText(name)लगातार setText("" + name)। क्योंकि यदि आप पाठ को संक्षिप्त करते हैं, तो इसका अनुवाद नहीं किया जाएगा जैसे कि आप संदेश सूचना के रूप में हार्डकोड पाठ का उपयोग करते हैं
Mr Neo

लेकिन यह दे देंगे NPEअगर nameहैNULL
प्रतीक Butani

फ़ंक्शन का उपयोग करने से पहले चेक nameनहीं है । NULLsetText()
श्री नव

2
आपको कुछ मान के साथ एक स्ट्रिंग संसाधन को संक्षिप्त नहीं करना चाहिए, इसके बजाय अपने स्ट्रिंग संसाधन में प्लेसहोल्डर्स का उपयोग करें। तो अपने string.xml में आप ऐसा करते हैं: <string name="string_product_rate_with_ruppe_sign">Something %1$d</string> और अपने जावा कोड में आप कुछ इस तरह से करते हैं: prodOriginalPriceView.setText(getString(R.string.string_product_rate_with_ruppe_sign), price); (आप xml फ़ाइल में स्वरूपण कर सकते हैं: [ developer.android.com/guide/topics/resources/…
CodeBreakx

जवाबों:


294

संसाधन में getString का अतिभारित संस्करण है जो एक varargsप्रकार का होता है Object: getString (int, java.lang.Object ...) । यदि आप अपने स्ट्रिंग को स्ट्रिंग में सही तरीके से सेटअप करते हैं। सही जगह धारकों के साथ, आप अपने अंतिम स्ट्रिंग के स्वरूपित संस्करण को पुनः प्राप्त करने के लिए इस संस्करण का उपयोग कर सकते हैं। उदाहरण के लिए

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

का उपयोग करते हुए getString(R.string.welcome_message, "Test", 0);

Android एक स्ट्रिंग के साथ वापस आ जाएगी

 "Hello Test! you have 0 new messages"

के बारे में setText("" + name);

आपका पहला उदाहरण, prodNameView.setText("" + name);मेरे लिए कोई मतलब नहीं है। TextView नल मानों को संभालने में सक्षम है। यदि नाम शून्य है, तो कोई पाठ नहीं निकाला जाएगा।


1
यह मानते हुए कि आपके बिगडेसिमल पर आप फ्लोट वैल्यू कहेंगे: %1$fस्ट्रिंग्स में जोड़ें । xml और फिर कॉल करेंsetText(getString(R.string.string_product_rate_with_ruppe_sign, new BigDecimal(price).setScale(2, RoundingMode.UP).floatValue() ));
Blackbelt

यह उत्तर के दूसरे भाग में है। एक नज़र है
Blackbelt

मैं एक पूर्णांक दिखाना चाहता हूं। स्ट्रिंग $ s और दशमलव $ d है। तो पूर्णांक के लिए खड़ा है?
reegan29

यदि आप "प्लेसहोल्डर" का उपयोग करते हैं, तो आप इसका उपयोग कर सकते हैं %1$d। @ reegan29
ब्लैकबेल्ट

3
: किसी के लिए एपीआई प्रारूपों के प्रकारों लिस्टिंग की तलाश में developer.android.com/reference/java/util/Formatter#syntax
ब्रेंट Sandstrom

34

स्वीकृत जवाब में % 1 $ s और % 2 $ d के साथ भ्रमित न हों । कुछ अतिरिक्त जानकारी है।

  • प्रारूप विनिर्देशक निम्नलिखित सिंटैक्स के हो सकते हैं:

% [ argument_index$]format_specifier

  1. वैकल्पिक आर्ग्युमेंट_इंडेक्स "%" के बाद "$" के साथ समाप्त होने वाली संख्या के रूप में निर्दिष्ट किया जाता है और तर्क सूची में निर्दिष्ट तर्क का चयन करता है। पहला तर्क "1 $" , दूसरा "2 $" , आदि द्वारा संदर्भित है ।
  2. आवश्यक प्रारूप विनिर्देशक एक चरित्र है जो यह दर्शाता है कि तर्क को कैसे स्वरूपित किया जाना चाहिए। किसी दिए गए तर्क के लिए मान्य रूपांतरण का सेट तर्क के डेटा प्रकार पर निर्भर करता है

उदाहरण

हम निम्न स्वरूपित स्ट्रिंग बनाएंगे जहां ग्रे भागों को प्रोग्रामेटिक रूप से डाला जाता है।

नमस्कार Test! आपके पास 0नए संदेश हैं

आपका string resource:

<string name = "welcome_messages"> हैलो %1$s,! आपके पास %2$dनए संदेश </ string> हैं

क्या string substitutionनीचे दिए गए के रूप में:

getString (R.string.welcome_message "Test", 0);

ध्यान दें:

  • % 1 $ s को स्ट्रिंग "टेस्ट" द्वारा प्रतिस्थापित किया जाएगा।
  • % 2 $ d को स्ट्रिंग "0" द्वारा प्रतिस्थापित किया जाएगा।

16

मैं उसी लिंट त्रुटि संदेश में भाग गया और इसे इस तरह से हल किया।

प्रारंभ में मेरा कोड था:

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText("" + quantity);
}

मुझे निम्नलिखित त्रुटि मिली

Do not concatenate text displayed with setText. Use resource string with placeholders.

इसलिए, मैंने इसे जोड़ा strings.xml

<string name="blank">%d</string>

जो मेरा प्रारंभिक "" + मेरी संख्या (मात्रा) के लिए प्लेसहोल्डर है।

नोट : मेरा quantityचर पहले परिभाषित किया गया था और वही है जो मैं स्ट्रिंग में जोड़ना चाहता था। परिणामस्वरूप मेरा कोड था

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText(getString(R.string.blank, quantity));
}

इसके बाद, मेरी त्रुटि दूर हो गई। एप्लिकेशन में व्यवहार में बदलाव नहीं हुआ और मेरी मात्रा प्रदर्शित होती रही क्योंकि मैं चाहता था कि अब यह एक लिंट त्रुटि के बिना हो।


10

आपको इस धागे की जाँच करनी चाहिए और अपने जैसे एक प्लेसहोल्डर का उपयोग करना चाहिए (परीक्षण नहीं किया गया)

<string name="string_product_rate_with_ruppe_sign">Price : %1$d</string>

String text = String.format(getString(R.string.string_product_rate_with_ruppe_sign),new BigDecimal(price).setScale(2, RoundingMode.UP));
prodOriginalPriceView.setText(text);

10

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

पूर्व: सही तरीका है

int min = 120;
int sec = 200;
int hrs = 2;

String minutes = String.format("%02d", mins);
            String seconds = String.format("%02d", secs);
            String newTime = hrs+":"+minutes+":"+seconds;

text.setText(minutes);

सेटटेक्स्ट () की तरह अंदर मत घुसाओ

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));

क्यों? एक दूसरे के क्या फायदे हैं?
फ्यूरिश

4

समस्या यह है क्योंकि आप ""प्रत्येक स्ट्रिंग की शुरुआत में संलग्न हैं।

लिंट पास किए जा रहे तर्कों को स्कैन करेगा setTextऔर चेतावनी देगा, आपके मामले में चेतावनी प्रासंगिक है:

पाठ विखंडन करके संदेशों का निर्माण न करें। ऐसे संदेशों का ठीक से अनुवाद नहीं किया जा सकता है।

जैसा कि आप हर स्ट्रिंग को समेट रहे हैं ""

इस निष्कर्ष को निकालें क्योंकि आप जो तर्क दे रहे हैं वह पहले से ही पाठ है। इसके अलावा, .toString()यदि आप अपनी स्ट्रिंग को समेटने के बजाय कहीं और आवश्यक हो तो उपयोग कर सकते हैं""


0

यदि आपको i18n का समर्थन करने की आवश्यकता नहीं है, तो आप Android स्टूडियो में इस लिंट चेक को अक्षम कर सकते हैं

फ़ाइल -> सेटिंग्स -> संपादक -> निरीक्षण -> Android -> Lint -> TextView अंतर्राष्ट्रीयकरण (इसे अनचेक करें)


0

आप इसका उपयोग कर सकते हैं, यह मेरे लिए काम करता है

title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));

0
prodNameView.setText("" + name); //this produce lint error

val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);

-1

मत पागल, यह बहुत आसान है।

String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
            mytextview.setText(result);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.