Réponses:
TextView
respecte le caractère d'espace sans coupure Unicode ( \u00A0
), ce qui serait une solution plus simple / plus légère que HTML.
\u00A0
est un espace insécable, \u0020
n'est pas un espace insécable
Il est possible d'utiliser
pour avoir une solution lisible. Inclure \u00A0
ou  
ou  
/  
dans le texte ne transmet pas vraiment beaucoup d'informations au lecteur du code source (ou au traducteur d'ailleurs), à moins que vous ne vous souveniez des codes hexadécimaux. Voici un moyen d'utiliser l'entité nommée dans strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
Cela créera la déclaration manquante. La déclaration HTML originale peut être trouvée dans https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent référencée à partir des DTD XHTML habituels . Tout cela fonctionne, car l'analyseur XML les lit et les remplace lors du chargement du fichier, de sorte que l'entité ne sera pas présente dans les ressources compilées résultantes.
dans Android Text ( CharSequence
) Resources<!-- 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"
/>
Appareil et aperçu (l'aperçu ne reconnaît pas le HTML)
dans les ressources de chaîne Android (formatées)<!-- 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"
/>
Puis dans le code:
String contents = getString(R.string.formatted_text, "Using an ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
Appareil et aperçu (l'aperçu ne reconnaît pas les entités et les chaînes Java sont du texte littéral!)
Ce ne sont que des exemples d'utilisation d'entités DTD, utilisez-les en fonction de vos préférences.
<!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>
’
caractère, pas besoin de créer des entités apostrophe. <string name="original">Don’t wrap %1$s</string>
fonctionne comme prévu.
'
VS ’
. Android n'a aucun problème avec des caractères Unicode plus sophistiqués, mais il a un problème avec ASCII 0x27, qui doit être échappé. L'entité est juste une commodité, je l'ai juste mise là pour montrer où elle pourrait être utile.
dans les chaînes est bien plus significatif pour les traducteurs que l'unicode\u00A0
con
et param1
dans le même fichier.
Une situation unique que j'ai rencontrée était l'ajout d'un espace insécable à une ressource de chaîne qui prenait des String.format
paramètres.
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
J'ai essayé de simplement copier et coller le caractère d'espace insécable dans la chaîne et il a été remplacé par un ancien espace régulier après la compilation.
La suppression du formaté = "false" , la numérotation des arguments de format et l'utilisation de la notation antislash a fonctionné pour moi:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Cela a fonctionné pour moi:
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);
}