Android Spanned, SpannedString, Spannable, SpannableString 및 CharSequence


96

안드로이드 이벤트 모든 텍스트 문자열에 관련된 다양한 인터페이스 : Spanned, SpannedString, Spannable, SpannableStringCharSequence.

나는 다양한 시나리오에 위의 모든 사용하고 일반적으로 사용 후 Html.fromHtml(), 안쪽 링크 가능한 텍스트를 표시하는 데 TextView여기에 몇 가지 스타일을 적용하기 위해.

나는 안드로이드의 공식 문서에서 이러한 인터페이스의 목적 / 사용을 이해하려고 노력했지만 상당히 혼란 스럽기 때문에 실패했습니다. 이러한 인터페이스의 목적은 무엇입니까? 어떤 시나리오에서 그것들을 사용하는 것이 가장 일반적입니까? 어떤 경우에 사용하지 않는 것이 가장 좋습니까? 그중 하나를 사용할 때 고려해야 할 명백한 성능 영향이 있습니까?

누구든지 괜찮은 설명을 할 수 있다면 대단히 감사하겠습니다.

답변:


149

이 인터페이스의 목적은 무엇입니까?

yuml.me/edit/5f8da6cb의 다이어그램 CharSequence일련의 문자를 나타내는 표준 Java 인터페이스입니다. String가장 일반적으로 사용되는 콘크리트 구현 한 CharSequence다음, StringBuilder.

SpannedCharSequence텍스트의 일부에 적용 할 서식을 나타내는 "범위" 가있는 입니다. 이러한 범위는 수정할 수 없습니다.

SpannableSpanned범위를 수정하는 기능 (서식을 추가하거나 제거하기 위해)을 추가하지만 텍스트 자체를 수정하는 것은 아닙니다 .

SpannedStringSpanned인터페이스 의 구체적인 구현입니다 .

SpannableStringSpannable인터페이스 의 구체적인 구현입니다 .

어떤 시나리오에서 그것들을 사용하는 것이 가장 일반적입니까?

하나를 반환하는 메서드가있는 경우 (예 : getText()EditText) 또는 하나를 매개 변수로 취하는 메서드가있는 경우 (예 : setText()TextView). yuml.me/edit/35c8f39f의 다이어그램

사용하여 귀하의 인용 경우는 Html.fromHtml()A와, 아마도 기존의 안드로이드 개발에서 가장 일반적인 TextViewA를가 Spanned보다 무게가 훨씬 가볍고입니다 WebView. 그러나 다음과 같은 다른 사용 사례가 있습니다.

어떤 경우에 사용하지 않는 것이 가장 좋습니까?

그들은 대머리 퇴치, 제설, 열 펌프 수리, 수플레 만들기 등에 매우 끔찍합니다.

:-)

그중 하나를 사용할 때 고려해야 할 명백한 성능 영향이 있습니까?

정의에 따라 인터페이스는 "성능에 영향을 미치지 않습니다". API에 대한 설명 일뿐입니다.

특정 작업에서 SpannableString보다 훨씬 느리다는 것을 알지 못합니다 SpannedString. 그러나, SpannableStringBuilder웰보다 약간 느릴 수있다 (텍스트 포맷 것을 그 스팬에 추가 텍스트를 조작 가능하게하는) SpannableString또는 SpannedString다양한 것들을. 그러나 성능 차이가 중요한지 여부는 사용량에 따라 다릅니다.


4
공식 문서는 침묵하기 때문에 어떻게 이러한 정보를 얻었습니까? 하드 코어 방식의 수동 소스 브라우징?
Pacerier 2014

11
@Pacerier :이 답변의 어떤 부분을 언급하고 있는지 잘 모르겠습니다. 예를 들어,이 답변에 설명 된 클래스 계층 구조는 문서, 특히 JavaDocs에서 가져온 것입니다. 반대로, 대머리와 싸우기 위해 이러한 것들이 유용하지 않은 것은 개인적인 관찰에서 비롯됩니다.
CommonsWare

@CommonsWare는 스마일이있는 문자열이 spannableString정상적인 문자열이 아닌 것으로 간주된다는 것을 의미 합니다. 일반 문자열에 비해 스마일 이 setText(my_string) 있을 때 my_string(watsapp과 같은) 큰 지연에 직면하고 있기 때문 입니다. . (일반 텍스트 만이있는) 친절하게 어떻게 든 내가 그 smilleys 아무것도하지만 텍스트 (유니 코드)없는 생각 ... 어떤 빛을 던져 만
eRaisedToX

1
@eRaisedToX : 스마일리는 이모티콘이나 이미지로 구현 될 수 있습니다. AFAIK, 이모티콘은 개별 유니 코드 문자이며 아마도 일반 문자열에있을 수 있습니다. 이미지 ImageSpan에는 SpannableString.
CommonsWare

아마도 확실하지만 ... 이모지를 다루고 일반 문자열을 사용하면 대머리 퇴치로 돌아갈 것입니다. Editables와 SpannableStringBuilders는 이모티콘을 구현할 때 가장 친한 친구입니다. 예, 그것들은 단순히 유니 코드이지만, 당신이 이모 지 스팬의 식별과 성능 비용이 발생하는 이모 지 스팬의 설정을 코딩하는 방법이라는 것을 알았습니다. 모르는 경우 다른 사람의 이모 지 라이브러리를 사용하는 데주의하십시오. 그들이 작동하는 방법 ...
JamisonMan111

45

A String는 변경할 수 없습니다 (즉, 텍스트를 변경할 수 없음). 또한 연관된 ​​스팬이 없습니다. (범위는 색상, 강조 표시, 기울임 꼴, 링크 등과 같은 스타일 정보를 포함하는 텍스트 범위입니다.) 따라서 String텍스트를 변경할 필요가없고 스타일을 지정할 필요가 없을 때 a를 사용할 수 있습니다 .

StringBuilder

A StringBuilder에는 변경 가능한 텍스트가 있으므로 새 개체를 만들지 않고도 수정할 수 있습니다. 그러나 스팬 정보가 없습니다. 일반 텍스트입니다. 따라서 StringBuilder텍스트를 변경해야하지만 스타일 지정에 신경 쓰지 않을 때를 사용 하십시오.

SpannedString

A SpannedString에는 변경 불가능한 텍스트 (a String와 같은 ) 및 변경 불가능한 범위 정보가 있습니다. Spanned인터페이스에서 정의한 요구 사항의 구체적인 구현입니다 . 를 사용하여 SpannedString텍스트 스타일을 가지고 있지만 당신이 그것을 만든 후 텍스트 나 스타일 중 하나를 변경할 필요가 없습니다 때.

참고 :SpannedStringBuilder 텍스트가 변경되면 범위 정보도 변경되어야하기 때문에 a와 같은 것은 없습니다 .

SpannableString

A SpannableString에는 변경 불가능한 텍스트가 있지만 범위 정보는 변경 가능합니다. Spannable인터페이스에서 정의한 요구 사항의 구체적인 구현입니다 . SpannableString텍스트는 변경할 필요가 없지만 스타일은 변경할 때 사용하십시오 .

SpannableStringBuilder

A SpannableStringBuilder에는 변경 가능한 텍스트와 범위 정보가 모두 있습니다. 이는 SpannableEditable인터페이스에서 정의한 요구 사항을 구체적으로 구현 한 것입니다 . SpannableStringBuilder텍스트와 스타일을 업데이트해야 할 때를 사용하십시오 .

CharSequence

A CharSequence는 구체적인 클래스가 아닌 인터페이스입니다. 즉,이를 구현하는 모든 클래스에 대해 따라야 할 규칙 목록을 정의합니다. 그리고 위에서 언급 한 모든 클래스가이를 구현합니다. 따라서 CharSequence최대한의 유연성을 위해 가지고있는 객체 유형을 일반화하려는 경우를 사용할 수 있습니다 . 필요할 경우 언제든지 String또는 SpannableStringBuilder또는 나중에 무엇이든 다운 캐스트 할 수 있습니다 .


4
나는, 읽고 이해하기가 매우 쉽고, 덕분에 당신의 응답을 제시하는 방법을 주셔서 감사합니다
JamisonMan111
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.