Android và & nbsp; trong TextView


108

có thể thêm  vào TextView không? Có ai đạt được chức năng tương tự không?

Tôi muốn có không gian không thể ngắt trong TextView.

Câu trả lời:


184

TextViewtô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.


3
Điều đó hoạt động tốt. Bạn có thể thêm nó vào xml hoặc trong mã java. Làm việc tốt trong mã java, trong xml, tôi chưa thử nghiệm nhiều, nhưng nó sẽ hoạt động tốt.
Mikooos

Cả \ u0020 và \ u00A0 đều không hoạt động. Không phải bằng cách đặt chúng trong XML (thậm chí không phải trong bản xem trước trong XML) cũng không bằng cách đặt chúng trong Java với setText (). Đã thử cả hai với Android 4.1 và 4.2
Stephan Wiesner

1
Điều đó không hoạt động cùng với dấu phẩy. Bạn nhận được một ngắt dòng ngay sau dấu phẩy trong trường hợp này
Alex Bonel

1
\ u00A0 không giúp tôi. Nó không có một không gian, chỉ cần tham gia những lời - Android 4.4.4, 5.0, 5.1
Marcel Bro

1
Trong Kotlin, nó hoạt động rất tốt. Tôi thay thế tất cả các khoảng trống bằng ký tự này và nó sẽ kích thước nhỏ hơn từ các ký tự cuối cùng. str.replace ("", "\ u00A0") cho kết quả "Xin chào ..." thay vì "Xin chào ..."
Seop Yoon

24

\u00A0là một không gian không phá vỡ, \u0020không phải là một không gian không phá vỡ


24

Nó có thể sử dụng   để có một giải pháp dễ đọc. Bao gồm \u00A0hoặ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 "&#160;"><!-- 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ả.

&nbsp;trong CharSequenceTài nguyên Android Text ( )

<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this&nbsp;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)
HTML trên thiết bị HTML trong bản xem trước

&nbsp; trong Tài nguyên chuỗi Android (đã định dạng)

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;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 &nbsp;");
((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!)
được định dạng trên thiết bị được định dạng trong bản xem trước

Các thủ thuật khác

Đâ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 "\&apos;"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
                            Sadly &apos; cannot be overridden due to XML spec:
                            https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "&#37;1$s"><!-- format string argument #1 -->

<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap &param1;</string>

Cả hai đều giúp làm nổi bật: các thực thể XML được đánh dấu


Android xử lý 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.
Diti

1
@Diti Đó không phải là một APOSTROPHE , đó là một THỊ TRƯỜNG BÁO GIÁ ĐÚNG ; so sánh '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.
TWiStErRob

Điều này là xuất sắc =) Cảm ơn bạn. Tôi thấy điều này sạch hơn và dễ đọc hơn nhiều.
Alex Hart

Câu trả lời tuyệt vời, cảm ơn bạn! Tôi đồng ý rằng có &nbsp;trong chuỗi là cách có ý nghĩa hơn đối với dịch giả hơn unicode\u00A0
Marc Attinasi

1
@ Tất nhiên, hãy xem phần cuối cùng (Các thủ thuật khác) bổ sung conparam1trong cùng một tệp.
TWiStErRob

18

TextView phải tôn trọng không gian không ngắt

<string name="test">Hello&#160;world</string>

hoặc là

new TextView("Hello\u00A0world");

3

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.formattham 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>

2

Đ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);
}

1

Đây là ví dụ sử dụng nbsp trong TextView

<string name="text">Example:\u00A0</string>


4
Đó phải là \ u00A0
poitroae
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.