Câu trả lời:
TextView
tôn trọng ký tự khoảng trắng không ngắt Unicode ( \u00A0
), đây sẽ là một giải pháp đơn giản / nhẹ nhàng hơn HTML.
\u00A0
là một không gian không phá vỡ, \u0020
không phải là một không gian không phá vỡ
Nó có thể sử dụng
để có một giải pháp dễ đọc. Bao gồm \u00A0
hoặc  
hoặc  
/  
trong văn bản không thực sự truyền tải nhiều thông tin đến người đọc mã nguồn (hoặc người dịch cho vấn đề đó), trừ khi bạn nhớ mã hex. Đây là một cách để sử dụng thực thể được đặt tên trong strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
Điều này sẽ tạo ra tờ khai bị thiếu. Khai báo HTML gốc có thể được tìm thấy trong https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent được tham chiếu từ các DTD XHTML thông thường . Tất cả điều này đều hoạt động, bởi vì trình phân tích cú pháp XML đọc những thứ này và thay thế trong khi tải tệp, vì vậy thực thể sẽ không có mặt trong các tài nguyên được biên dịch kết quả.
trong CharSequence
Tài nguyên Android Text ( )<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this name</b></string>
<!-- Used in a layout -->
<TextView
android:layout_width="130dp"
android:layout_height="wrap_content"
android:background="#10000000"
android:text="@string/html_text"
/>
Thiết bị và bản xem trước (bản xem trước không nhận dạng HTML)
trong Tài nguyên chuỗi Android (đã định dạng)<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is nice</string>
<!-- Used in a layout -->
<TextView
android:layout_width="130dp"
android:layout_height="wrap_content"
android:background="#10000000"
tools:text="@string/formatted_text"
/>
Sau đó, trong mã:
String contents = getString(R.string.formatted_text, "Using an ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
Thiết bị và bản xem trước (bản xem trước không nhận dạng các thực thể và chuỗi Java là văn bản theo nghĩa đen!)
Đây chỉ là những cách sử dụng ví dụ của các thực thể DTD, hãy sử dụng nó dựa trên sở thích của riêng bạn.
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
’
ký tự tốt, không cần tạo thực thể dấu nháy đơn. <string name="original">Don’t wrap %1$s</string>
hoạt động như mong đợi.
'
VS ’
. Android không gặp vấn đề với các ký tự Unicode lạ mắt hơn, nhưng nó gặp vấn đề với ASCII 0x27, cần thoát. Thực thể chỉ là một tiện ích, tôi chỉ đặt nó ở đó để chứng minh nơi nó có thể hữu ích.
trong chuỗi là cách có ý nghĩa hơn đối với dịch giả hơn unicode\u00A0
con
và param1
trong cùng một tệp.
Một tình huống duy nhất mà tôi gặp phải là thêm khoảng trắng không ngắt vào tài nguyên chuỗi có String.format
tham số.
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
Tôi đã cố gắng sao chép và dán ký tự khoảng trắng không ngắt vào chuỗi và nó đã được thay thế bằng một khoảng trắng cũ thông thường sau khi biên dịch.
Loại bỏ formatted = "false" , đánh số các args định dạng và sử dụng ký hiệu dấu gạch chéo ngược phù hợp với tôi:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Điều này đã làm việc cho tôi:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
textview.setText(Html.fromHtml(your string);
}