2011-10-26 42 views
22

Tôi có một tài nguyên chuỗi gọi là "foo". Nó có thể là một chuỗi đơn giản ... hoặc nó có thể chứa HTML. Điều này có thể thay đổi theo thời gian: Tôi sẽ có thể hộp nó lên như ít nhất một SpannableString ngay khi đọc cho dù đó là HTML hay không (nhưng làm thế nào ??)Android: chuyển đổi giữa các chuỗi, SpannedStrings và Spannablestrings

Tôi muốn nhận được rằng CharSequence liệu và lần đầu tiên có thể để hiển thị nó như là (các nhân vật chính xác, không phải là "giải thích" của Android về nó). Ngay bây giờ tôi không thể làm điều đó ... toString() quyết định tách ra những phần mà nó không nghĩ rằng tôi muốn xem.

Sau đó tôi muốn có thể tạo SpannableString từ này và các Chuỗi hoặc SpannableStrings khác thông qua nối bằng cách sử dụng một số phương pháp (không có phương thức nào hoạt động bình thường). Sau đó tôi muốn sử dụng SpannableString đó để hiển thị văn bản được định dạng HTML trong một TextView.

Điều này không khó, nhưng rõ ràng tôi không làm đúng (có rất ít thông tin về điều này mà tôi đã tìm thấy cho đến nay). Chắc chắn có một cách để trao đổi chính xác giữa các chuỗi, SpannedStrings và thậm chí Spannablestrings, mà không làm mất các đánh dấu trên đường đi?

Lưu ý rằng tôi đã chơi với Linkify bị hỏng, nhưng tôi muốn kiểm soát tốt hơn quá trình này (không có các nút không định dạng "," thích hợp ", v.v.) ở trong HTML ở tất cả các bước, mặc dù tôi không thể nối bất cứ điều gì.

Chỉnh sửa 1: Tôi đã học được Tôi có thể sử dụng những điều sau để luôn đảm bảo tôi nhận được chuỗi thô của mình (thay vì bất kỳ điều gì mà Android cho rằng nó thực sự là CharSequence). Nice ... bây giờ, làm thế nào để dỗ này vào SpannableString?

<string name="foo"><![CDATA[ 
    <b>Some bold</b> 
]]> 
</string> 

Chỉnh sửa 2: Không chắc tại sao điều này không làm việc trước đó, nhưng ... nếu foo1 và foo2 được chuỗi đánh dấu lên như trên (như CDATA), sau đó người ta có thể rõ ràng làm điều này:

String foo1 = (String)getResources().getText(R.string.foo1); 
String foo2 = (String)getResources().getText(R.string.foo2); 
SpannedString bar = new SpannedString(Html.fromHtml(foo1+foo2)); 

Tò mò: có giải pháp đơn giản hơn này không? Đây có phải là doanh nghiệp CDATA thực sự cần thiết không? Nó có vẻ phức tạp (nhưng không phức tạp như không bao giờ khá biết loại tài nguyên sẽ là ... Chuỗi, Spannable, vv)

+1

Dường như bạn đã trả lời câu hỏi của riêng bạn tại đây. Ví dụ foo1, foo2 của bạn ở trên có vẻ ổn. Nếu bạn không có câu hỏi cụ thể khác, bạn nên trả lời câu hỏi của mình để câu hỏi được xóa khỏi phần chưa được trả lời. CDATA là cần thiết để nhúng HTML vào XML bởi vì nếu không thì các phần tử html sẽ không thể phân biệt được với XML kèm theo. –

Trả lời

1

Có vẻ như không có cách nào đơn giản hơn để thực hiện việc này.

1

Tôi gặp vấn đề tương tự. Có hai giải pháp theo Google API Guides.

Đầu tiên là để thoát < đánh dấu bằng &lt; trong tài nguyên chuỗi. Thật không may, String chuyển đổi sẽ xóa thẻ trong nền.

Thứ hai là sử dụng Định dạng chuỗi thay vì thẻ XML/HTML. Dường như đơn giản hơn, nhanh hơn và tránh được các vấn đề chuyển đổi ẩn. getString(resource, ...) hoạt động như một số printf(string, ...) tại đây.

Cả hai công việc và yêu cầu một số mã để thay thế một phần nhất định của chuỗi đó (xử lý thẻ hoặc chuỗi định dạng). Thưởng thức! =)

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