2012-03-26 27 views
43

Ai đó có thể giải thích rõ ràng về các ví dụ của span flags như SPAN_EXCLUSIVE_EXCLUSIVESPAN_MARK_MARK có nghĩa là gì và khi nào nên sử dụng cờ nào?Giải thích ý nghĩa của cờ Span giống như SPAN_EXCLUSIVE_EXCLUSIVE

Tôi không hiểu các tài liệu chính thức khi nó nói:

nhịp của loại SPAN_EXCLUSIVE_EXCLUSIVE không mở rộng để bao gồm văn bản chèn vào một trong hai bắt đầu hoặc điểm kết thúc của họ.

Có phải "mở rộng để bao gồm" tham chiếu đến các chỉnh sửa được thực hiện sau khi chèn các nhịp không?

Điều đó có nghĩa là các cờ này KHÔNG ảnh hưởng đến Spannables bằng văn bản không thể thay đổi?

Trả lời

69

Có phải "mở rộng để bao gồm" tham chiếu đến các chỉnh sửa được thực hiện sau khi chèn các nhịp không?

Có. Ví dụ: giả sử chúng ta có những điều sau đây:

cáo nhanh nhảy lên.

Nếu chúng ta sử dụng SPAN_EXCLUSIVE_EXCLUSIVE trên nhịp đậm, và chúng tôi chèn văn bản ở giữa nhịp, nó vẫn là chữ đậm:

Các nhanh fox nâu nhảy.

Tuy nhiên, nếu chúng ta chèn văn bản ở đầu hoặc cuối của nhịp đậm, các văn bản chèn không phải là chữ đậm:

Các thực sự fox nhanh chóng nhảy.

Tuy nhiên, nếu chúng ta đã sử dụng SPAN_INCLUSIVE_EXCLUSIVE, sau đó chèn văn bản ngay từ đầu sẽ được bao gồm như là một phần của nhịp, và chúng ta sẽ có:

Cáo thực sự nhanh chóng nhảy.

Có nghĩa là các cờ này KHÔNG ảnh hưởng đến Spannables có văn bản không thay đổi?

Tôi có thể nói rằng chúng bị hạn chế sử dụng cho văn bản không thay đổi. Chủ yếu, chúng sẽ được sử dụng với SpannableStringBuilder hoặc những thứ sử dụng một trong các bìa (ví dụ: EditText).

+1

, câu trả lời hay. Bạn có thể giải thích các cờ được kéo dài khác không? Vui lòng xem http://stackoverflow.com/q/16392417/596555 – boiledwater

50

gì những lá cờ không có nghĩa là

Khi tôi lần đầu tiên chứng kiến ​​sự INCLUSIVEEXCLUSIVE bộ phận của Spannable cờ, tôi nghĩ họ chỉ nói hay không span bao gồm các vị trí bắt đầu và chỉ số cuối của nhịp. Đây không phải là sự thật. Hãy để tôi minh họa điều đó với ví dụ sau.

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); 

Dưới đây là kết quả:

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

tất cả Họ đều giống nhau! Những lá cờ không ảnh hưởng đến nhịp. Một khoảng luôn luôn bao gồm ký tự ở chỉ mục bắt đầu và loại trừ ký tự ở chỉ mục kết thúc.

gì cờ thực sự có nghĩa

Các INCLUSIVEEXCLUSIVE bộ phận của lá cờ Spannable thực sự nói hay không span nên bao gồm văn bản được chèn lúc bắt đầu hoặc kết thúc vị trí.

Dưới đây là ví dụ được sửa đổi để minh họa điều đó.

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); 

Đây là kết quả sau khi chèn một x ở cuối và bắt đầu chỉ số:

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

Ghi chú

  • Hầu hết các câu trả lời này mô tả điều OP đã biết. Tôi chỉ thêm nó cho những vị khách tương lai như bản thân tôi, những người không biết những điều này.
  • Trong ví dụ thứ hai, tôi phải sử dụng SpannableStringBuilder vì văn bản trong một SpannableString là không thay đổi để bạn không thể chèn văn bản vào đó. Do đó, các cờ thường vô nghĩa đối với một số SpannableString.Tuy nhiên, người ta có thể tưởng tượng một tình huống trong đó các nhịp từ một số SpannableString được sao chép sang một số SpannableStringBuilder hoặc Editable và từ đó các cờ sẽ có ý nghĩa.
  • See this answer cho sự khác biệt giữa SpannableString, SpannableStringBuilder, Editable và hơn thế nữa.
Các vấn đề liên quan