Android Yayılmış, SpannedString, Spannable, SpannableString ve CharSequence


96

Android teklifler tüm metin ve dizeleri ile ilgili arayüzleri çeşitli: Spanned, SpannedString, Spannable, SpannableStringve CharSequence.

Yukarıdakilerin hepsini çeşitli senaryolarda kullandıktan sonra genellikleHtml.fromHtml() a içindeki bağlanabilir metni TextViewona biraz stil uygulamak için görüntüledikten sonra kullandım .

Bu arayüzlerin amacını / kullanımını Android'in resmi belgelerinden anlamaya çalıştım ve oldukça kafa karıştırıcı olduğu için başarısız oldum .. Bu arayüzlerin amacı nedir? Bunları kullanmak en çok hangi senaryolarda yaygındır? Hangi durumlarda bunları kullanmaktan kaçınmak en iyisidir? Bunlardan herhangi birini kullanırken dikkate alınması gereken bariz performans etkileri var mı?

Herhangi biri makul bir açıklama yapabilseydi çok takdir edilecektir.

Yanıtlar:


149

Bu arayüzlerin amacı nedir?

yuml.me/edit/5f8da6cb'den diyagram CharSequencebir karakter dizisini temsil eden standart bir Java arayüzüdür. Stringen yaygın kullanılan somut uygulamadır CharSequence, ardından StringBuilder.

Spanneda, CharSequenceo açıklıklı değiştirilemez metin bölümlerini uygulamak için biçimlendirme belirten "yayılma" ile.

SpannableBir olan Spanned, yayılma değiştirme yeteneği ekleyerek (eklemek veya biçimlendirme kaldırmak), ama değil , metnin kendisini değiştirmek için.

SpannedStringSpannedarayüzün somut bir uygulamasıdır .

SpannableStringSpannablearayüzün somut bir uygulamasıdır .

Bunları kullanmak en çok hangi senaryolarda yaygındır?

Bir yöntem olduğunda bu döner bir (örneğin getText()bir ile EditText) ya da (bakınız, örneğin, bir parametre olarak alır bir yöntem olduğu zaman setText()bir ile TextView). yuml.me/edit/35c8f39f adresinden diyagram

Belirtilen kullanım durumunuz, Html.fromHtml()geleneksel Android geliştirmede belki de en yaygın olanıdır, çünkü a TextViewile a Spanned, a'dan çok daha hafiftir WebView. Ancak, aşağıdakiler gibi başka kullanım durumları da vardır:

Hangi durumlarda bunları kullanmaktan kaçınmak en iyisidir?

Kellik, kar temizleme, ısı pompası onarımı, sufle yapma vb. İle mücadelede olağanüstü derecede kötüdürler.

:-)

Bunlardan herhangi birini kullanırken dikkate alınması gereken bariz performans etkileri var mı?

Arayüzlerin tanımları gereği "performans etkileri" yoktur - bunlar yalnızca bir API'nin açıklamasıdır.

Bunun herhangi bir operasyondan SpannableStringçok daha yavaş olduğunun farkında değilim SpannedString. Bununla birlikte, SpannableStringBuilder(bu, metni biçimlendiren aralıklara ek olarak metni değiştirmeye izin verir), çeşitli şeylerden SpannableStringveya SpannedStringçeşitli şeylerden biraz daha yavaş olabilir . Performans farklılıklarının önemli olup olmadığı, kullanıma bağlı olacaktır.


4
Resmi belgeler sessiz olduğuna göre, bu bilgileri nereden aldınız? El ile kaynak taraması zor yoldan mı?
Pacerier

11
@Pacerier: Bu cevabın hangi kısmından bahsettiğinizden emin değilim. Örneğin, bu yanıtta açıklanan sınıf hiyerarşisi kesinlikle belgelerden, özellikle de JavaDocs'tan gelir. Tersine, kellikle mücadelede bu şeylerin kullanılmaması kişisel gözlemden kaynaklanmaktadır.
CommonsWare

@CommonsWare, bu, arada gülen suratlar olan bir dizenin spannableStringnormal bir dize olarak kabul edileceği anlamına gelir .. çünkü normal diziye kıyasla içinde gülen suratlar (watsapp'ınki gibi) setText(my_string) olduğunda büyük bir gecikme yaşıyorum my_string. . (sadece düz metni olan) nazikçe biraz ışık atın ... bir şekilde smilley'lerin yalnızca metinden (unicode) başka bir şey olmadığına inandım
eRaisedToX

1
@eRaisedToX: Suratlar emoji veya görseller olarak uygulanabilir. AFAIK, emoji tek tek Unicode karakterleri olabilir ve muhtemelen normal bir dizede olabilir. Görüntüler ImageSpan, sırayla bunu gerektirir SpannableString.
CommonsWare

Muhtemelen eminim ... ama emojilerle uğraşmayı ve normal Dizeleri kullanmayı deneyin ve kellikle mücadeleye hemen geri döneceksiniz. Düzenlenebilirler ve SpannableStringBuilders, konu emojiyi uygulamaya geldiğinde en iyi arkadaşınızdır. Evet, bunlar sadece unicode olsa da, emoji aralığını tanımlamayı ve performans maliyetinizin geldiği yer olan emoji aralığını nasıl kodladığınızdır. Bilmiyorsanız başkalarının emoji kitaplıklarını kullanırken dikkatli olun nasıl
işliyorlar

45

Dize

A Stringdeğişmezdir (yani metin değişemez). Ayrıca kendisiyle ilişkili herhangi bir açıklığı da yoktur. (Aralıklar, renk, vurgulama, italik, bağlantılar vb. Gibi stil bilgilerini içeren metin üzerindeki aralıklardır.) Böylece Stringmetninizin değiştirilmesi gerekmediğinde ve herhangi bir stil gerektirmediğinde a kullanabilirsiniz.

StringBuilder

A StringBuilder, değiştirilebilir bir metne sahiptir, böylece yeni bir nesne oluşturmadan onu değiştirebilirsiniz. Ancak, herhangi bir aralık bilgisine sahip değildir. Bu sadece düz metindir. StringBuilderMetni değiştirmeniz gerektiğinde a kullanın , ancak onu şekillendirmeyi umursamıyorsunuz.

SpannedString

A SpannedString, değişmez metne (a gibi String) ve değişmez yayılma bilgisine sahiptir. SpannedArayüz tarafından tanımlanan gereksinimlerin somut bir uygulamasıdır . SpannedStringMetninizin stili olduğunda a kullanın , ancak oluşturulduktan sonra metni veya stili değiştirmeniz gerekmez.

Not: Böyle bir şey yoktur, SpannedStringBuilderçünkü metin değişirse, o zaman aralık bilgisinin de büyük olasılıkla değişmesi gerekecektir.

SpannableString

A SpannableStringdeğişmez bir metne sahiptir, ancak yayılma bilgisi değiştirilebilir. SpannableArayüz tarafından tanımlanan gereksinimlerin somut bir uygulamasıdır . SpannableStringMetninizin değiştirilmesi gerekmediğinde ancak stilin değiştiği durumlarda a kullanın .

SpannableStringBuilder

A SpannableStringBuilderhem değiştirilebilir metne hem de aralık bilgisine sahiptir. SpannableVe Editablearayüzleri (diğerleri arasında) tarafından tanımlanan gereksinimlerin somut bir uygulamasıdır . SpannableStringBuilderMetni ve stilini güncellemeniz gerektiğinde a kullanın .

CharSequence

A CharSequencebir arayüzdür ve somut bir sınıf değildir. Bu, onu uygulayan herhangi bir sınıf için izlenecek kuralların bir listesini tanımladığı anlamına gelir. Ve yukarıda bahsedilen tüm sınıflar bunu uygular. Böylece CharSequence, maksimum esneklik için sahip olduğunuz nesne türünü genelleştirmek istediğinizde a kullanabilirsiniz . İhtiyaç duyarsanız her zaman bir Stringveya SpannableStringBuilderdaha sonra her neyse onu indirebilirsin .


4
Yanıtınızı
sunma şeklinizi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.