2013-07-09 25 views
65

Android cung cấp một loạt các giao diện tất cả liên quan đến văn bản và chuỗi: Spanned, SpannedString, Spannable, SpannableStringCharSequence.Android Spanned, SpannedString, Spannable, SpannableString và CharSequence

Tôi đã sử dụng tất cả những điều trên trong các tình huống khác nhau thường sau khi sử dụng để hiển thị Html.fromHtml() linkable văn bản bên trong một TextView để áp dụng một số phong cách với nó.

Tôi đã cố gắng hiểu mục đích/cách sử dụng các giao diện này từ tài liệu chính thức của Android và đã thất bại vì nó khá khó hiểu .. Mục đích của các giao diện này là gì? trong đó kịch bản nào là phổ biến nhất để sử dụng chúng? Trong trường hợp nào tốt nhất là tránh sử dụng chúng? Có bất kỳ tác động hiệu suất rõ ràng nào để được xem xét khi sử dụng bất kỳ một trong số chúng?

Nếu có ai có thể đưa ra một lời giải thích hợp lý, nó sẽ được đánh giá cao.

Trả lời

116

Mục đích của các giao diện này là gì?

diagram from yuml.me/edit/5f8da6cb CharSequence là giao diện Java chuẩn trình bày chuỗi ký tự. String là triển khai cụ thể được sử dụng phổ biến nhất của CharSequence, tiếp theo là StringBuilder.

SpannedCharSequence với "nhịp" chỉ định định dạng để áp dụng cho các phần của văn bản, trong đó các nhịp đó không thể sửa đổi được.

SpannableSpanned, thêm khả năng sửa đổi các nhịp (để thêm hoặc xóa định dạng), nhưng không phải để sửa đổi văn bản.

SpannedString là triển khai cụ thể của giao diện Spanned.

SpannableString là triển khai cụ thể của giao diện Spannable.

trong trường hợp này, điều thường xảy ra khi sử dụng chúng là gì?

Khi có một phương pháp mà trả về một (ví dụ, getText() trên một EditText) hoặc khi có một phương pháp mà mất một như một tham số (ví dụ, setText() trên TextView). diagram from yuml.me/edit/35c8f39f

trường hợp trích dẫn của bạn sử dụng Html.fromHtml() có lẽ là phổ biến nhất trong việc phát triển Android thông thường, như một TextView với một Spanned là nhẹ hơn trọng lượng hơn là một WebView.Tuy nhiên, có những trường hợp sử dụng khác, chẳng hạn như:

Trong trường hợp nào tốt nhất là tránh sử dụng chúng?

Họ này đặc biệt là khủng khiếp tại chống hói, dọn tuyết, sửa chữa máy bơm nhiệt, làm cho một Souffle vv

:-)

Có bất kỳ tác động hiệu suất rõ ràng để được xem xét khi sử dụng bất kỳ một trong số họ?

Giao diện, theo định nghĩa, không có "tác động hiệu suất" - chúng chỉ là mô tả về API.

Tôi không biết rằng SpannableString chậm hơn đáng kể so với SpannedString tại bất kỳ hoạt động cụ thể nào. Tuy nhiên, SpannableStringBuilder (cho phép thao tác văn bản ngoài các nhịp có định dạng văn bản đó) có thể chậm hơn một chút so với SpannableString hoặc SpannedString cho nhiều thứ khác nhau. Dù sự khác biệt về hiệu suất có đủ để quan trọng hay không sẽ phụ thuộc vào cách sử dụng.

+3

Vì tài liệu chính thức ở chế độ im lặng, Bạn nhận được những thông tin này từ đâu? Thủ công nguồn duyệt theo cách hardcore? – Pacerier

+8

@Pacerier: Tôi không chắc chắn phần nào của câu trả lời này mà bạn đang đề cập đến. Ví dụ, phân cấp lớp được mô tả trong câu trả lời này chắc chắn nhất xuất phát từ tài liệu, đặc biệt là các JavaDocs. Ngược lại, sự thiếu tiện ích của những thứ này để chống lại chứng hói đầu đến từ quan sát cá nhân. – CommonsWare

+0

@CommonsWare, do đó, điều đó có nghĩa là một chuỗi có biểu tượng mặt cười ở giữa sẽ được coi là 'spannableString' và không phải là bình thường. vì tôi đang đối mặt với độ trễ lớn với 'setText (my_string)' khi 'my_string' có biểu tượng mặt cười trong nó (giống như của watsapp) so với chuỗi bình thường .. (mà chỉ có văn bản đơn giản) vui lòng ném một số ánh sáng ... bằng cách nào đó tôi tin rằng smilleys là gì, nhưng văn bản (unicode) chỉ – eRaisedToX

13

String

Một String là không thay đổi (ví dụ, các văn bản không thể thay đổi). Nó cũng không có bất kỳ nhịp liên kết với nó. (Các khoảng rộng nằm trên văn bản bao gồm thông tin tạo kiểu như màu sắc, đánh dấu, in nghiêng, liên kết, v.v.) Vì vậy, bạn có thể sử dụng String khi văn bản của bạn không cần phải thay đổi và không cần bất kỳ kiểu dáng nào.

StringBuilder

Một StringBuilder có văn bản có thể thay đổi, vì vậy bạn có thể sửa đổi nó mà không cần tạo một đối tượng mới. Tuy nhiên, nó không có bất kỳ thông tin khoảng. Nó chỉ là văn bản thuần túy. Vì vậy, hãy sử dụng StringBuilder khi bạn cần thay đổi văn bản, nhưng bạn không quan tâm đến việc tạo kiểu cho văn bản đó.

SpannedString

Một SpannedString có văn bản bất biến (giống như một String) và thông tin khoảng thời gian không thay đổi. Nó là một việc thực hiện cụ thể các yêu cầu được xác định bởi giao diện Spanned. Sử dụng SpannedString khi văn bản của bạn có kiểu nhưng bạn không cần thay đổi văn bản hoặc kiểu sau khi văn bản được tạo.

Lưu ý: Không có nội dung nào là SpannedStringBuilder vì nếu văn bản thay đổi thì thông tin khoảng thời gian cũng rất có thể sẽ phải thay đổi.

SpannableString

Một SpannableString có văn bản bất biến, nhưng thông tin khoảng thời gian của nó là có thể thay đổi.Đó là việc triển khai cụ thể các yêu cầu được xác định bởi giao diện Spannable. Sử dụng một số SpannableString khi văn bản của bạn không cần phải thay đổi nhưng kiểu dáng không.

SpannableStringBuilder

Một SpannableStringBuilder có cả văn bản có thể thay đổi và span thông tin. Đó là việc triển khai cụ thể các yêu cầu được xác định bởi các giao diện SpannableEditable (trong số những người khác). Sử dụng SpannableStringBuilder khi bạn cần cập nhật văn bản và kiểu của văn bản.

CharSequence

Một CharSequence là một giao diện và không phải là một lớp bê tông. Điều đó có nghĩa là nó chỉ định nghĩa một danh sách các quy tắc để làm theo cho bất kỳ lớp nào thực hiện nó. Và tất cả các lớp được đề cập ở trên đều thực hiện nó. Vì vậy, bạn có thể sử dụng một CharSequence khi bạn muốn khái quát hóa loại đối tượng mà bạn có cho sự linh hoạt tối đa. Bạn luôn có thể chuyển nó xuống một số String hoặc SpannableStringBuilder hoặc bất cứ điều gì sau này nếu bạn cần.

+0

Tôi đánh giá cao cách bạn thể hiện phản hồi của mình, rất dễ đọc và hiểu, cảm ơn – JamisonMan111

Các vấn đề liên quan