Android и & nbsp; в TextView


109

можно ли добавить  в TextView? Кто-нибудь добился подобной функциональности?

Я хочу, чтобы в TextView было неразрывное пространство.

Ответы:


185

TextViewуважает неразрывный пробел Unicode ( \u00A0), что было бы более простым / легким решением, чем HTML.


3
Это прекрасно работает. Вы можете добавить это в xml или в Java-код. Хорошо работает в java-коде, в xml я особо не тестировал, но он должен работать.
Mikooos 04

Ни \ u0020, ни \ u00A0 не работают. Ни путем установки их в XML (даже в предварительном просмотре в XML), ни путем установки их в Java с помощью setText (). Пробовал как с Android 4.1, так и с 4.2
Стефан Визнер,

1
Это не работает в сочетании с запятой. В таких случаях вы получаете разрыв строки сразу после запятой
Alex Bonel

1
\ u00A0 меня не устраивает. Он не оставляет места, просто объединяет слова - Android 4.4.4, 5.0, 5.1
Марсель Бро

1
В Котлине это работает очень хорошо. Я заменяю на это все пустые места, и последние символы будут иметь многоточие. str.replace ("", "\ u00A0") выдает "Привет, привет ..." вместо "Привет ..."
Сеоп Юн


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

<!-- 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>работает как положено.
Diti

1
@Diti Это не АПОСТРОФ , это ПРАВИЛЬНАЯ ЕДИНАЯ ЦИТАТА ; сравнить 'VS . У Android нет проблем с более причудливыми символами Unicode, но у него есть проблема с ASCII 0x27, которая требует экранирования. Сущность просто удобна, я просто поместил ее туда, чтобы продемонстрировать, где она может быть полезна.
TWiStErRob

Это отлично =) Спасибо. Я считаю, что это намного чище и легче для чтения.
Alex Hart

Отличный ответ, спасибо! Я согласен с тем, что наличие &nbsp;строк имеет большее значение для переводчиков, чем юникод,\u00A0
Марк Аттинаси

1
@Seven, конечно, см. Последний раздел (Дополнительные приемы), который добавляет 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>

Я попытался просто скопировать и вставить неразрывный пробел в строку, и после компиляции он был заменен обычным старым пробелом.

Удаление formatted = "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.