2011-11-17 39 views
12

Trong ứng dụng của tôi, tôi muốn xác định một chuỗi định dạng trong strings.xml trông như thế này (chú ý <b>...</b> tags):Làm cách nào để sử dụng kiểu html trong chuỗi có đối số định dạng?

<string name="location"><b>Location:</b> %1$s</string> 

Và sau đó sử dụng getString(int, Object...) để thay thế trong một cuộc tranh luận dạng:

String formattedString = getString(R.string.location, "Edmonton, AB"); 

Giá trị này tạo ra giá trị "Location: Edmonton, AB". Tôi muốn nhận giá trị "<b>Location:</b> Edmonton, AB".

Có cách nào để thực hiện việc này bằng cách sử dụng các định dạng chuỗi trong strings.xml mà không chia nhỏ nó thành hai chuỗi không?

Trả lời

17

Từ docs:

Đôi khi bạn có thể muốn tạo một tài nguyên văn bản theo kiểu đó cũng là sử dụng như một chuỗi định dạng. Thông thường, điều này sẽ không hoạt động bởi vì phương thức String.format (String, Object ...) sẽ loại bỏ tất cả thông tin kiểu từ chuỗi. Công việc xung quanh việc này là viết các thẻ HTML với các thực thể thoát, sau đó được khôi phục với từHtml (Chuỗi), sau khi định dạng diễn ra.

Ví dụ:

<resources> 
    <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string> 
</resources> 

Hãy chắc chắn để thoát khỏi văn bản bạn đang đi qua trong String.format()

String escapedUsername = TextUtils.htmlEncode(username); 
Resources res = getResources(); 
String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount); 
CharSequence styledText = Html.fromHtml(text); 
+0

Cảm ơn, không chắc chắn làm thế nào tôi bị mất trong tài liệu! – Greg

+0

@GregInYEG - Xảy ra với những điều tốt nhất của chúng tôi. Hân hạnh. –

+0

Chỉ cần nhận thức được thực tế là phương thức TextUtils.htmlEncode() không thay thế '' (dấu cách) bằng ' '. Điều này gây ra rắc rối trong trường hợp của tôi (tôi đang sử dụng mailto: siêu liên kết với các tham số chủ thể và nội dung). Nếu không thì giải pháp trên hoạt động tốt. – pepan

1

Sử dụng String.Format. ví dụ.

<string name="location"><![CDATA[<b>Location:</b> %s]]></string> 

String formattedString = String.Format(getString(R.string.location), "Edmonton, AB"); 
+0

Chuỗi trong ví dụ của bạn không chứa phong cách. Nếu có, cuộc gọi đến getString (R.string.location) sẽ loại bỏ chúng. – Greg

+0

Tôi nghĩ rằng điểm là định dạng một chuỗi mà là ví dụ của tôi. Thêm các ký tự định dạng làm tham số bổ sung cho phương thức định dạng. – Kuffs

+0

String.format (getString (R.string.location), "Edmonton, AB") trả về cùng một điều như getString (R.string.location, "Edmonton, AB"). Không lưu giữ các kiểu như ... trong chuỗi từ strings.xml. @ iPaulPro của câu trả lời chỉ vào tài liệu android giải thích nếu tôi muốn sử dụng cả hai kiểu và định dạng đối số, tôi cần phải thoát khỏi phong cách và sử dụng Html.fromHtml (...). – Greg

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