Android та & nbsp; у TextView


108

чи можна додати  в TextView? Хтось домігся подібної функціональності?

Я хочу мати нерозривний простір у TextView.

Відповіді:


184

TextViewповажає символ простору Unicode без перерви ( \u00A0), що було б простішим / легшим рішенням, ніж HTML.


3
Це чудово працює. Ви можете додати це в xml або в java-код. Працює чудово у коді Java, у xml я не перевіряв багато, але це повинен зробити цю роботу.
Mikooos

Ні \ u0020, ні \ u00A0 не працюють. Ні встановивши їх у XML (навіть не в попередньому перегляді в XML), ні встановивши їх у Java за допомогою setText (). Спробував обидва з Android 4.1 та 4.2
Stephan Wiesner

1
Це не працює разом із комою. Ви отримуєте перерву рядка відразу після коми через такі коми
Алекс Бонель

1
\ u00A0 не робить для мене хитрощів. Це не робить пробіл, просто приєднується до слів - Android 4.4.4, 5.0, 5.1
Marcel Bro

1
У Котліні це працює дуже добре. Я замінюю всі порожні пробіли на це, і воно зникне з останніх символів. str.replace ("", "\ u00A0") поступається, "Hello Hello ..." замість "Hello ..."
Seop Yoon

24

\u00A0є нерозривним простором, \u0020не є нерозривним простором


24

Можна використовувати  для читання рішення. Включення \u00A0або /  або в текст насправді не передає багато інформації читачеві вихідного коду (або перекладача з цього питання), якщо ви не пам'ятаєте шістнадцяткові коди. Ось спосіб використання названої сутності в :  strings.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

Це створить відсутність декларації. Оригінальну декларацію HTML можна знайти на https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent, на яку посилаються звичайні XHTML DTD . Все це працює, тому що XML-аналізатор читає їх та замінює під час завантаження файлу, тому сутність не буде присутня в отриманих компільованих ресурсах.

&nbsp;в CharSequenceресурсах 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"
    />

Пристрій та попередній перегляд (попередній перегляд не розпізнає HTML)
HTML на пристрої HTML у попередньому перегляді

&nbsp; в ресурсах Android String (відформатовані)

<!-- 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"
    />

Потім у коді:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);

Пристрій та попередній перегляд (попередній перегляд не розпізнає об'єкти, а рядки Java - це буквальний текст!)
відформатовано на пристрої відформатований у попередньому перегляді

Подальші хитрощі

Це лише приклади використання об'єктів DTD, використовуйте його на основі власних уподобань.

<!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>

Обидва вони допомагають виділити: виділені сутності XML


Android обробляє персонажа просто чудово, не потрібно створювати сутність апострофа. <string name="original">Don’t wrap %1$s</string>працює як очікувалося.
Діті

1
@Diti Це не АПОСТРОФ , це ПРАВА ЄДНА ОЦІНКА ЦИТКИ ; порівняти 'VS . Android не має проблем з більш фантазійними символами Unicode, але у нього є проблема з ASCII 0x27, яка потребує втечі. Сутність - це просто зручність, я просто розміщую її там, щоб продемонструвати, де вона може бути корисною.
TWiStErRob

Це чудово =) Дякую. Я вважаю це набагато чистішим та легшим для читання.
Алекс Харт

Чудова відповідь, дякую! Я погоджуюсь, що наявність &nbsp;у рядках перекладачів є більш значущим, ніж унікод\u00A0
Marc Attinasi

1
@ Сім звичайно, дивіться останній розділ (Подальші трюки), який додає, conі param1в тому ж файлі.
TWiStErRob

18

TextView повинен поважати нерозривний простір

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

або

new TextView("Hello\u00A0world");

3

Одна унікальна ситуація, в яку я зіткнувся, - це додавання нерозривного простору до рядкового ресурсу, який приймав String.formatпараметри.

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

Я спробував просто скопіювати і пропустити нерозривний символ пробілу в рядок, і він був замінений на звичайний старий пробіл після компіляції.

Видалення відформатованого = "false" , нумерація аргументів формату та використання позначення зворотної косої риси для мене працювали:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>

2

Це працювало для мене:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.