2012-03-26 385 views
43

有人可以用例子清楚地解釋每個span flags類似SPAN_EXCLUSIVE_EXCLUSIVESPAN_MARK_MARK的意思和什麼時候使用什麼標誌?解釋跨度標誌的含義,如SPAN_EXCLUSIVE_EXCLUSIVE

SPAN_EXCLUSIVE_EXCLUSIVE

跨度不擴大到包括在任的起點或終點插入的文本 :

當它說我不明白的官方文檔。

「擴展到包含」是指插入跨度後所做的編輯嗎?

這是否意味着這些標誌不會影響具有不可變文本的Spannables?

回答

69

「擴展到包含」是指插入跨度後所做的編輯嗎?

是。例如,我們假設我們有以下幾種:

quick fox躍升。

如果我們在粗體跨度使用SPAN_EXCLUSIVE_EXCLUSIVE,而我們在跨中插入文本,它仍然是黑體字:

敏捷的棕色狐狸跳下。

但是,如果我們在起始處插入文本或粗體跨度結束時,插入的文本不是粗體字:

真正快速狐狸跳下。

但是,如果我們使用SPAN_INCLUSIVE_EXCLUSIVE,然後插入開頭的文字將被納入跨度的一部分,我們將有:

真快狐狸跳下。

這是否意味着這些標誌不會影響具有不可變文本的Spannables?

我會說他們對不可變文本的使用有限。大多數情況下,這些將與SpannableStringBuilder或使用其中一個的東西(例如,EditText)一起使用。

+1

,很好的答案。你能解釋其他跨越國旗嗎?請參閱http://stackoverflow.com/q/16392417/596555 – boiledwater 2013-05-06 07:29:45

50

什麼標誌並不意味着

當我第一次看到INCLUSIVEEXCLUSIVE部分Spannable標誌,我以爲他們只是告訴跨度是否不包括段的起始和結束索引位置。這不是真的。讓我用下面的例子來說明。

String myString = ""; 
int start = 1; 
int end = 3; 
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing 

SpannableString spannableString = new SpannableString(myString); 
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); 
spannableString.setSpan(foregroundSpan, start, end, spanFlag); 
textView.setText(spannableString); 

下面是結果:

SPAN_INCLUSIVE_INCLUSIVE

enter image description here

SPAN_INCLUSIVE_EXCLUSIVE

enter image description here

SPAN_EXCLUSIVE_INCLUSIVE

enter image description here

SPAN_EXCLUSIVE_EXCLUSIVE

enter image description here

他們都是一樣的!標誌不影響跨度。 範圍始終在其開始索引處包含字符,並排除末尾索引處的字符。

什麼標誌的真正含義

INCLUSIVEEXCLUSIVE部分Spannable標誌實際上告訴跨度是否應該包括被在開始或結束位置插入文本。

這裏是一個修改的例子來說明這一點。

String myString = ""; 
int start = 1; 
int end = 3; 
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing 

// set the span 
SpannableStringBuilder spannableString = new SpannableStringBuilder(myString); 
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); 
spannableString.setSpan(foregroundSpan, start, end, spanFlag); 

// insert the text after the span has already been set 
// (inserting at start index second so that end index doesn't get messed up) 
spannableString.insert(end, "x"); 
spannableString.insert(start, "x"); 

textView.setText(spannableString); 

下面是在端部插入x後的結果,並開始索引:

SPAN_INCLUSIVE_INCLUSIVE

enter image description here

SPAN_INCLUSIVE_EXCLUSIVE

enter image description here

SPAN_EXCLUSIVE_INCLUSIVE

enter image description here

SPAN_EXCLUSIVE_EXCLUSIVE

enter image description here

  • 大多數這個答案的描述事物的OP已經知道了。我只是將它添加到像我這樣不瞭解這些事情的未來訪問者。
  • 在第二個示例中,我不得不使用SpannableStringBuilder,因爲SpannableString中的文本是不可變的,因此您無法在其中插入文本。因此,對於SpannableString這些標誌通常沒有意義。但是,可以想象將SpannableString的跨度複製到SpannableStringBuilderEditable的情況,並且從那裏標誌將具有含義。
  • See this answerSpannableString,SpannableStringBuilder,Editable等之間的差異。