2011-08-26 30 views
8

Tôi đang đặt Span thành một phần văn bản. Bản thân Span hoạt động tốt. Tuy nhiên, văn bản được tạo bởi String.format từ Resources và tôi không biết startend một phần trong văn bản tôi sẽ đặt Span thành.Android: Làm thế nào để kết hợp Spannable.setSpan với String.format?

Tôi đã cố gắng sử dụng thẻ HTML tùy chỉnh trong strings.xml nhưng xóa getText hoặc getString xóa chúng. Tôi có thể sử dụng một cái gì đó như thế này getString(R.string.text, "<nb>" + arg + "</nb>"), sau đó Html.fromHtml(), bởi vì các arg là chính xác nơi tôi muốn thiết lập các Span.

Tôi đã xem this approach sử dụng văn bản được tạo thành "normal text ##span here## normal text". Nó phân tích chuỗi sẽ loại bỏ các thẻ và đặt Span.

Câu hỏi của tôi là, có cách nào tốt hơn để hoàn thành thiết lập Span thành chuỗi được định dạng như "something %s something" hoặc tôi có nên sử dụng một trong các phương pháp trên không?

Trả lời

2

Tôi đã giải quyết vấn đề này bằng cách giới thiệu lớp TaggedArg, các phiên bản của lớp này mở rộng thành <tag>value</tag>. Sau đó, tôi tạo ra đối tượng chịu trách nhiệm đọc văn bản chứa thẻ và thay thế các thẻ này bằng các nhịp. Các nhịp khác nhau được đăng ký trong thẻ bản đồ-> nhà máy.

Có một chút ngạc nhiên. Nếu bạn có văn bản như "<xx>something</xx> something", Html.fromHtml đọc văn bản này là "<xx>something something</xx>". Tôi phải thêm thẻ <html> xung quanh toàn bộ văn bản để ngăn chặn điều này.

2

getText() sẽ trả về SpannedString đối tượng chứa định dạng được xác định trong strings.xml. Tôi đã tạo ra a custom version of String.format sẽ giữ lại bất kỳ nhịp nào trong chuỗi định dạng, ngay cả khi chúng bao gồm các định dạng thông số (kéo dài trong các đối số SpannedString cũng được giữ nguyên). Sử dụng nó như thế này:

Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux); 
0

Cách theo getText() mà George cho là thú vị. Nhưng không cần viết thêm một lớp nữa. getText() trả về số CharSequence. Vì vậy, sử dụng SpannableStringBuilder để thiết lập này cho một TextView:

textViewCell.setText(new SpannableStringBuilder(getText(R.string.foo)); 

Trong strings.xml của bạn, bạn có thể viết nó với html tags (đừng quên những trích dẫn trước và sau khi văn bản):

<string name="foo">"CO<sub><small>2</small></sub>"</string> 

Loại gắn thẻ này làm việc cho tôi hoặc là đặt nó theo cách thủ công thành textView (như trên) hoặc gán nó trong một bố cục.

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