Android и & nbsp; в TextView

109

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

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

Mikooos
источник

Ответы:

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это неразрывный пробел, \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

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

TWiStErRob
источник
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);
}
Мадхан Секар
источник
1

Это пример использования nbsp в TextView

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

Камены
источник
4
Это должно быть \ u00A0
poitroae