Android Spanned, SpannedString, Spannable, SpannableString और CharSequence


92

एंड्रॉयड प्रस्तावों इंटरफेस की एक किस्म सभी पाठ और तार से संबंधित: Spanned, SpannedString, Spannable, SpannableStringऔर CharSequence

मैंने उपरोक्त सभी को विभिन्न परिदृश्यों में आमतौर पर उपयोग Html.fromHtml()करने के बाद लिंक करने योग्य पाठ को प्रदर्शित करने के लिए उपयोग TextViewकिया है ताकि इसे कुछ स्टाइल लगाया जा सके।

मैंने एंड्रॉइड के आधिकारिक दस्तावेज से इन इंटरफेस के उद्देश्य / उपयोग को समझने की कोशिश की है और असफल रहा है क्योंकि यह काफी भ्रमित है .. इन इंटरफेस का उद्देश्य क्या है? किन परिदृश्यों में उनका उपयोग करना आम है? किन मामलों में उनका उपयोग करने से बचना सबसे अच्छा है? क्या उनमें से किसी एक का उपयोग करते समय कोई स्पष्ट प्रदर्शन प्रभाव माना जाता है?

अगर किसी को एक अच्छी व्याख्या प्रदान कर सकता है यह बहुत सराहना की जाएगी।

जवाबों:


148

इन इंटरफेस का उद्देश्य क्या है?

yuml.me/edit/5f8da6cb से आरेख CharSequenceवर्णों के अनुक्रम का प्रतिनिधित्व करने वाला एक मानक जावा इंटरफ़ेस है। Stringका सबसे अधिक इस्तेमाल किया जाने वाला ठोस कार्यान्वयन है CharSequence, इसके बाद StringBuilder

Spannedएक है CharSequence"फैला" पाठ, जहां उन फैला बदला नहीं जा सकता के कुछ भागों को लागू करने के लिए स्वरूपण का संकेत के साथ।

Spannableएक है Spanned, स्पैन को संशोधित करने (स्वरूपण को जोड़ने या हटाने के लिए) की क्षमता में जोड़ने पर, लेकिन पाठ को स्वयं संशोधित करने के लिए नहीं

SpannedStringSpannedइंटरफ़ेस का एक ठोस कार्यान्वयन है ।

SpannableStringSpannableइंटरफ़ेस का एक ठोस कार्यान्वयन है ।

किन परिदृश्यों में उनका उपयोग करना आम है?

जब एक विधि होती है जो एक (जैसे, a ) getText()पर लौटती है EditTextया जब एक विधि होती है जो एक पैरामीटर (जैसे, setText()a TextView) के रूप में लेती है । yuml.me/edit/35c8f39f से आरेख

का उपयोग करने का आपका उद्धृत मामले Html.fromHtml()शायद, पारंपरिक Android विकास में सबसे आम है के रूप में एक TextViewएक साथ Spannedवजन में बहुत हल्का से एक है WebView। हालाँकि, अन्य उपयोग के मामले हैं, जैसे:

किन मामलों में उनका उपयोग करने से बचना सबसे अच्छा है?

वे गंजापन, बर्फ हटाने, गर्मी पंप की मरम्मत, एक सूफले बनाने, आदि का मुकाबला करने में विलक्षण रूप से भयानक हैं।

:-)

क्या उनमें से किसी एक का उपयोग करते समय कोई स्पष्ट प्रदर्शन प्रभाव माना जाता है?

परिभाषा के अनुसार, "प्रदर्शन प्रभाव" नहीं है - वे केवल एक एपीआई का विवरण हैं।

मुझे पता नहीं है कि किसी विशेष ऑपरेशन SpannableStringकी तुलना SpannedStringमें काफी धीमी है । हालाँकि, SpannableStringBuilder(जो पाठ को उस प्रारूप के अतिरिक्त पाठ में हेरफेर करने की अनुमति देता है) अच्छी तरह से SpannableStringया SpannedStringविभिन्न चीजों से थोड़ा धीमा हो सकता है । भले ही प्रदर्शन अंतर पदार्थ के लिए पर्याप्त हो या नहीं, उपयोग पर निर्भर करेगा, हालांकि।


4
चूंकि आधिकारिक डॉक्स चुप हैं, आपको ये जानकारी कैसे मिली? हार्डकोर तरीका ब्राउज़िंग मैनुअल?
पचेरियर

11
@ स्पेसर: मुझे यकीन नहीं है कि आप इस उत्तर का क्या हिस्सा बता रहे हैं। उदाहरण के लिए, इस उत्तर में वर्णित वर्ग पदानुक्रम निश्चित रूप से प्रलेखन, विशेष रूप से जावाडॉक्स से आता है। इसके विपरीत, गंजापन से निपटने के लिए इन चीजों की उपयोगिता की कमी व्यक्तिगत अवलोकन से आती है।
कॉमन्सवेयर

@CommonsWare, ताकि मतलब यह है कि बीच में स्माइली के साथ एक स्ट्रिंग एक विचार किया जाएगा spannableString.. और नहीं एक सामान्य से एक है क्योंकि मैं के साथ एक बहुत बड़ा अंतराल का सामना करना पड़ रहा setText(my_string) है जब my_string(watsapp की तरह) उस में स्माइली है के रूप में सामान्य स्ट्रिंग की तुलना में। । (जो केवल सादा पाठ है) कृपया कुछ प्रकाश डालें ... किसी तरह मैंने माना कि स्माइली केवल पाठ (यूनिकोड) के अलावा कुछ नहीं है
eRaisedToX

1
@eRaisedToX: स्माइली को इमोजी या छवियों के रूप में लागू किया जा सकता है। AFAIK, इमोजी व्यक्तिगत यूनिकोड वर्ण होंगे और संभवतः एक नियमित स्ट्रिंग में हो सकते हैं। छवियों की आवश्यकता होती है ImageSpanजो बदले में आवश्यकता होती है SpannableString
कॉमन्सवेयर जुआर

निश्चित रूप से निश्चित ... लेकिन इमोजीस से निपटने और नियमित स्ट्रिंग्स का उपयोग करने की कोशिश करें और आप गंजापन का मुकाबला करने के लिए सही रहेंगे। जब यह इमोजीस को लागू करने की बात आती है तो Editables और SpannableStringBuilders आपके सबसे अच्छे दोस्त हैं। मैंने पाया कि हाँ, जबकि वे बस यूनिकोड हैं, यह है कि आप इमोजी स्पैन की पहचान और इमोजी स्पैन की सेटिंग को कोड करते हैं, जहाँ आपके प्रदर्शन की लागत आ रही है। अन्य लोगों के इमोजी लाइब्रेरी का उपयोग करने में सावधानी बरतें यदि आप नहीं जानते हैं। वे कैसे कार्य करते हैं ...
JamisonMan111

43

तार

A Stringअपरिवर्तनीय है (अर्थात, पाठ परिवर्तित नहीं हो सकता)। इसके साथ कोई स्पैन भी नहीं जुड़ा है। (स्पैंस टेक्स्ट के ऊपर होते हैं, जिसमें स्टाइलिंग जानकारी जैसे रंग, हाइलाइटिंग, इटैलिक, लिंक इत्यादि शामिल होते हैं) इसलिए आप तब उपयोग कर सकते हैं Stringजब आपके टेक्स्ट को बदलने की आवश्यकता नहीं होती है और किसी स्टाइलिंग की आवश्यकता नहीं होती है।

StringBuilder

A StringBuilderमें परिवर्तनशील पाठ है, इसलिए आप इसे एक नई वस्तु बनाए बिना संशोधित कर सकते हैं। हालाँकि, इसकी कोई स्पैन जानकारी नहीं है। यह सिर्फ सादा पाठ है। इसलिए StringBuilderजब आपको पाठ को बदलने की आवश्यकता हो, तो इसका उपयोग करें, लेकिन आप इसे स्टाइल करने के बारे में परवाह नहीं करते हैं।

SpannedString

A SpannedStringमें अपरिवर्तनीय पाठ (जैसे String) और अपरिवर्तनीय अवधि की जानकारी है। यह Spannedइंटरफ़ेस द्वारा परिभाषित आवश्यकताओं का एक ठोस कार्यान्वयन है । SpannedStringजब आपके पाठ में शैली हो, तो उपयोग करें लेकिन इसके बनने के बाद आपको पाठ या शैली को बदलने की आवश्यकता नहीं है।

नोट: ऐसी कोई बात नहीं है SpannedStringBuilderक्योंकि यदि पाठ बदल गया है, तो अवधि की जानकारी भी बदलने की संभावना होगी।

SpannableString

A के SpannableStringपास अपरिवर्तनीय पाठ है, लेकिन इसकी अवधि की जानकारी परस्पर है। यह Spannableइंटरफ़ेस द्वारा परिभाषित आवश्यकताओं का एक ठोस कार्यान्वयन है । एक का उपयोग करें SpannableStringजब अपने पाठ परिवर्तित करने की आवश्यकता नहीं है लेकिन स्टाइल करता है।

SpannableStringBuilder

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

CharSequence

A CharSequenceएक इंटरफ़ेस है न कि एक ठोस वर्ग। इसका मतलब यह है कि यह किसी भी वर्ग के लिए पालन करने वाले नियमों की एक सूची को परिभाषित करता है जो इसे लागू करता है। और ऊपर वर्णित सभी वर्ग इसे लागू करते हैं। इसलिए CharSequenceजब आप अधिकतम लचीलेपन के लिए वस्तु के प्रकार को सामान्य करना चाहते हैं, तब आप इसका उपयोग कर सकते हैं । आप कर सकते हैं हमेशा यह खिन्न करने के लिए एक Stringया SpannableStringBuilderया जो भी बाद में अगर आप की जरूरत है।


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