Respuestas:
TextView
respeta el carácter de espacio sin interrupciones Unicode ( \u00A0
), que sería una solución más simple / ligera que HTML.
\u00A0
es un espacio que no se rompe, \u0020
no es un espacio que no se rompe
Se puede utilizar
para tener una solución legible. Incluir \u00A0
o  
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 " "><!-- 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.
en los CharSequence
recursos de Android Text ( )<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this 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)
en los recursos de Android String (formateados)<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is 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 ");
((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)
Estos son solo ejemplos de usos de entidades DTD, utilícelos según sus preferencias.
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
’
personaje, no es necesario crear entidades de apóstrofo. <string name="original">Don’t wrap %1$s</string>
funciona como se esperaba.
'
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.
en las cadenas es mucho más significativo para los traductores que el Unicode\u00A0
con
y param1
en el mismo archivo.
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.format
pará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>
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);
}