Android y & nbsp; en TextView

108

¿Es posible agregar  en TextView? ¿Alguien ha logrado una funcionalidad similar?

Quiero tener un espacio irrompible en TextView.

Mikooos
fuente

Respuestas:

184

TextViewrespeta el carácter de espacio sin interrupciones Unicode ( \u00A0), que sería una solución más simple / ligera que HTML.

Dan Dyer
fuente
3
Eso funciona muy bien. Puede agregar eso a xml o en código java. Funciona bien en código java, en xml no he probado mucho, pero debería hacer el trabajo.
Mikooos
Ni \ u0020 ni \ u00A0 funcionan. Ni configurándolos en XML (ni siquiera en la vista previa en XML) ni configurándolos en Java con setText (). Probé ambos con Android 4.1 y 4.2
Stephan Wiesner
1
Eso no funciona junto con la coma. Obtienes un salto de línea justo después de la coma en tales casos
Alex Bonel
1
\ u00A0 no me funciona. No hace un espacio, solo une las palabras - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
En Kotlin, funciona muy bien. Reemplazo todos los espacios vacíos con esto, y se elipsará de los últimos caracteres. str.replace ("", "\ u00A0") produce, "Hola, trabajo ..." en lugar de "Hola ..."
Seop Yoon
24

\u00A0es un espacio que no se rompe, \u0020no es un espacio que no se rompe

Brenagwynn
fuente
24

Se puede utilizar  para tener una solución legible. Incluir \u00A0o  o  /  en el texto no transmite mucha información al lector del código fuente (o al traductor para el caso), a menos que recuerde los códigos hexadecimales. He aquí una forma de usar la entidad nombrada en strings.xml:

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

Esto creará la declaración que falta. La declaración HTML original se puede encontrar en https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent referenciada desde los DTD XHTML habituales . Todo esto funciona, porque el analizador XML los lee y los sustituye mientras carga el archivo, por lo que la entidad no estará presente en los recursos compilados resultantes.

&nbsp;en los CharSequencerecursos de 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"
    />

Dispositivo y vista previa (la vista previa no reconoce HTML)
HTML en el dispositivo HTML en vista previa

&nbsp; en los recursos de Android String (formateados)

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

Luego en código:

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

Dispositivo y vista previa (la vista previa no reconoce entidades y las cadenas de Java son texto literal)
formateado en el dispositivo formateado en vista previa

Más trucos

Estos son solo ejemplos de usos de entidades DTD, utilícelos según sus preferencias.

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

Ambos ayudan a destacar: entidades XML resaltadas

TWiStErRob
fuente
Android maneja bien el personaje, no es necesario crear entidades de apóstrofo. <string name="original">Don’t wrap %1$s</string>funciona como se esperaba.
Diti
1
@Diti Eso no es un APÓSTROFE , es una SOLA CITA DE LA DERECHA ; comparar 'VS . Android no tiene problemas con caracteres Unicode más sofisticados, pero tiene un problema con ASCII 0x27, que necesita escapar. La entidad es solo una conveniencia, solo la puse allí para demostrar dónde podría ser útil.
TWiStErRob
Esto es excelente =) Gracias. Encuentro esto mucho más limpio y fácil de leer.
Alex Hart
¡Gran respuesta, gracias! Estoy de acuerdo en que tener &nbsp;en las cadenas es mucho más significativo para los traductores que el Unicode\u00A0
Marc Attinasi
1
@Seven, por supuesto, consulte la última sección (Más trucos) que agrega cony param1en el mismo archivo.
TWiStErRob
18

El TextView debe respetar el espacio que no se rompe

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

o

new TextView("Hello\u00A0world");
rds
fuente
3

Una situación única con la que me encontré fue la de agregar un espacio sin interrupciones a un recurso de cadena que tomaba String.formatparámetros.

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

Intenté simplemente copiar y pegar el carácter de espacio que no se rompe en la cadena y fue reemplazado por un espacio antiguo regular después de compilar.

Eliminar el formatted = "false" , numerar los argumentos de formato y usar la notación de barra invertida funcionó para mí:

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

Esto funcionó para mí:

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);
}
Madhan Sekar
fuente
1

Este es un ejemplo de que el uso de nbsp en un TextView

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

Kameny
fuente
4
Eso debería ser \ u00A0
poitroae