Android et & nbsp; dans TextView

108

est-il possible d'ajouter  dans TextView? Quelqu'un a-t-il atteint des fonctionnalités similaires?

Je veux avoir un espace insécable dans TextView.

Mikooos
la source

Réponses:

184

TextViewrespecte le caractère d'espace sans coupure Unicode ( \u00A0), ce qui serait une solution plus simple / plus légère que HTML.

Dan Dyer
la source
3
Cela fonctionne très bien. Vous pouvez l'ajouter au xml ou au code java. Fonctionne bien en code java, en xml je n'ai pas beaucoup testé, mais cela devrait faire le travail.
Mikooos le
Ni \ u0020 ni \ u00A0 ne fonctionnent. Ni en les définissant en XML (pas même dans l'aperçu en XML) ni en les définissant en Java avec setText (). Essayé les deux avec Android 4.1 et 4.2
Stephan Wiesner
1
Cela ne fonctionne pas avec la virgule. Vous obtenez un saut de ligne juste après la virgule dans de tels cas
Alex Bonel
1
\ u00A0 ne fait pas l'affaire pour moi. Il ne fait pas d'espace, joint simplement les mots - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
À Kotlin, cela fonctionne très bien. Je remplace tous les espaces vides par ceci, et cela va ellipser à partir des derniers caractères. str.replace ("", "\ u00A0") renvoie "Hello wor ..." au lieu de "Hello ..."
Seop Yoon
24

\u00A0est un espace insécable, \u0020n'est pas un espace insécable

Brenagwynn
la source
24

Il est possible d'utiliser  pour avoir une solution lisible. Inclure \u00A0ou  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 "&#160;"><!-- 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.

&nbsp;dans Android Text ( CharSequence) Resources

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

Appareil et aperçu (l'aperçu ne reconnaît pas le HTML)
HTML sur l'appareil HTML en aperçu

&nbsp; dans les ressources de chaîne Android (formatées)

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

Puis dans le code:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((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!)
formaté sur l'appareil formaté en aperçu

Autres astuces

Ce ne sont que des exemples d'utilisation d'entités DTD, utilisez-les en fonction de vos préférences.

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

Les deux aident à mettre en évidence: entités XML mises en évidence

TWiStErRob
la source
Android gère très bien le caractère, pas besoin de créer des entités apostrophe. <string name="original">Don’t wrap %1$s</string>fonctionne comme prévu.
Diti le
1
@Diti Ce n'est pas un APOSTROPHE , c'est une BONNE Citation UNIQUE ; comparer '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.
TWiStErRob
C'est excellent =) Merci. Je trouve cela beaucoup plus propre et plus facile à lire.
Alex Hart
Excellente réponse, merci! Je suis d'accord que le fait d'avoir &nbsp;dans les chaînes est bien plus significatif pour les traducteurs que l'unicode\u00A0
Marc Attinasi
1
@Seven bien sûr, voir la dernière section (Autres astuces) qui ajoute conet param1dans le même fichier.
TWiStErRob
18

Le TextView doit respecter l'espace insécable

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

ou

new TextView("Hello\u00A0world");
rds
la source
3

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.formatparamè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>
Jon
la source
2

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

Ceci est un exemple d'utilisation de nbsp dans un TextView

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

Kameny
la source
4
Cela devrait être \ u00A0
poitroae