Android et dans TextView

Est-il possible d'ajouter   dans TextView? Quelqu'un at-il atteint des fonctionnalités similaires?

Je veux avoir un espace non cassable dans TextView.

83
demandé sur Mikooos 2011-07-03 22:38:09

7 réponses

Je n'ai pas essayé cela pour m'assurer que cela fonctionne réellement, mais dans un monde idéal {[0] } devrait respecter le caractère D'espace sans rupture Unicode (\u00A0), ce qui serait une solution plus simple/plus légère que HTML.

148
répondu Dan Dyer 2011-07-03 19:27:06

\u00A0 est un espace insécable, \u0020 n'est pas un espace insécable

19
répondu Brenagwynn 2012-04-05 13:50:45

Le TextView doit respecter l'espace non cassant

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

Ou

new TextView("Hello\u00A0world");
16
répondu rds 2014-09-26 11:44:49

Il est possible d'utiliser &nbsp; pour avoir lisible une solution. y compris \u00A0 ou &#160; ou &#xa0;/&#x00a0; dans le texte ne transmet pas vraiment beaucoup d'informations au lecteur du code source (ou Traducteur d'ailleurs), sauf si vous vous souvenez 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 originale HTML se trouve dans https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent référencé à partir de l'habituel XHTML DTD . 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 le texte Android (CharSequence) ressources

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

Périphérique et aperçu (aperçu ne reconnaît pas HTML)
HTML sur le périphérique HTML dans l'aperçu

{[5] } Dans Android String (formaté) ressources

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

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

Périphérique et aperçu (aperçu ne reconnaît pas les entités et les chaînes Java sont du texte littéral!)
formaté sur l'appareil formaté dans l'aperçu

Autres astuces

Ce ne sont que des exemples d'utilisations d'entités DTD, utilisez-le en fonction de vos propres 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 en surbrillance

13
répondu TWiStErRob 2016-04-17 12:06:50

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

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

1
répondu kameny 2015-03-09 09:40:12

Une situation unique que j'ai rencontrée a été l'ajout d'un espace insécable à une ressource de chaîne qui a pris des paramètres String.format.

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

J'ai essayé de simplement copier et dépasser le caractère d'espace non-breaking dans la chaîne et il a été remplacé par un ancien espace régulier après la compilation.

Supprimer le formatted = "false" , numéroter les args de format et utiliser la notation antislash a fonctionné pour moi:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
1
répondu Jon 2015-10-09 18:21:26

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);
}
0
répondu Madhan Sekar 2017-07-08 19:18:45