Jaki jest cel tych interfejsów?
CharSequence
to standardowy interfejs Java reprezentujący sekwencję znaków. String
jest najczęściej używaną konkretną implementacją CharSequence
, po której następuje StringBuilder
.
Spanned
jest CharSequence
z „rozpiętościami” wskazującymi formatowanie, które należy zastosować do fragmentów tekstu, których rozpiętości nie można modyfikować.
Spannable
jest Spanned
dodaniem możliwości modyfikowania rozpiętości (dodawania lub usuwania formatowania), ale nie modyfikowania samego tekstu.
SpannedString
jest konkretną implementacją Spanned
interfejsu.
SpannableString
jest konkretną implementacją Spannable
interfejsu.
w jakich scenariuszach najczęściej ich używa się?
Kiedy istnieje metoda, która zwraca jedynkę (np. getText()
Na a EditText
) lub gdy istnieje metoda, która przyjmuje je jako parametr (np. setText()
Na a TextView
).
Twój cytowany przypadek użycia Html.fromHtml()
jest prawdopodobnie najbardziej powszechny w konwencjonalnym programowaniu na Androida, ponieważ a TextView
z a Spanned
jest znacznie lżejszy niż WebView
. Istnieją jednak inne przypadki użycia, takie jak:
W jakich przypadkach najlepiej ich unikać?
Są wyjątkowo okropne w walce z łysieniem, odśnieżaniem, naprawą pompy ciepła, robieniem sufletu itp.
:-)
Czy są jakieś oczywiste skutki, które należy wziąć pod uwagę podczas korzystania z któregokolwiek z nich?
Interfejsy z definicji nie mają „wpływu na wydajność” - stanowią jedynie opis interfejsu API.
Nie wiem, czy SpannableString
jest to znacznie wolniejsze niż SpannedString
przy jakiejkolwiek konkretnej operacji. Jednak SpannableStringBuilder
(co pozwala na manipulowanie tekstem oprócz rozpiętości formatu tego tekstu) może być nieco wolniejsze niż SpannableString
lub SpannedString
do różnych rzeczy. Jednak to, czy różnice w wydajności mają znaczenie, zależy od użytkowania.
spannableString
a nie normalny ... ponieważ mam ogromne opóźnienie,setText(my_string)
kiedymy_string
ma w nim emotikony (jak w przypadku watsapp) w porównaniu do zwykłego ciągu. . (który ma tylko zwykły tekst) uprzejmie rzuć trochę światła ... jakoś uwierzyłem, że smilleys to nic innego jak tekst (Unicode)ImageSpan
co z kolei wymagaSpannableString
.Strunowy
A
String
jest niezmienne (tj. Tekst nie może się zmienić). Nie ma też żadnych powiązanych z nim rozpiętości. (Rozpiętości to zakresy w tekście, które zawierają informacje dotyczące stylu, takie jak kolor, wyróżnienie, kursywa, łącza itp.) Możesz więc użyć znaku a,String
gdy tekst nie wymaga zmiany i nie wymaga stylizacji.StringBuilder
A
StringBuilder
ma zmienny tekst, więc możesz go modyfikować bez tworzenia nowego obiektu. Jednak nie ma żadnych informacji o rozpiętości. To tylko zwykły tekst. Dlatego używaj a,StringBuilder
gdy musisz zmienić tekst, ale nie dbasz o stylizację.SpannedString
A
SpannedString
ma niezmienny tekst (taki jak aString
) i niezmienne informacje o rozpiętości. Jest to konkretna implementacja wymagań zdefiniowanych przezSpanned
interfejs. Użyj a,SpannedString
gdy twój tekst ma styl, ale nie musisz zmieniać ani tekstu, ani stylu po jego utworzeniu.Uwaga: Nie ma czegoś takiego jak a,
SpannedStringBuilder
ponieważ gdyby tekst się zmienił, informacja o rozpiętości prawdopodobnie również musiałaby ulec zmianie.SpannableString
A
SpannableString
ma niezmienny tekst, ale jego informacje o rozpiętości są zmienne. Jest to konkretna implementacja wymagań zdefiniowanych przezSpannable
interfejs. Użyj a,SpannableString
gdy nie musisz zmieniać tekstu, ale styl tak.SpannableStringBuilder
A
SpannableStringBuilder
ma zmienny tekst i informacje o zakresie. Jest to konkretna implementacja wymagań zdefiniowanych przez interfejsySpannable
iEditable
(między innymi). Użyj,SpannableStringBuilder
gdy będziesz musiał zaktualizować tekst i jego styl.CharSequence
A
CharSequence
to interfejs, a nie konkretna klasa. Oznacza to, że po prostu definiuje listę reguł, których należy przestrzegać dla każdej klasy, która go implementuje. I wszystkie wymienione powyżej klasy go implementują. Możesz więc użyć a,CharSequence
gdy chcesz uogólnić typ obiektu, który masz, aby uzyskać maksymalną elastyczność. Można zawsze przygnębiony go naString
lubSpannableStringBuilder
lub cokolwiek później, jeśli zajdzie taka potrzeba.źródło