Android e & nbsp; in TextView


108

è possibile aggiungere  in TextView? Qualcuno ha ottenuto funzionalità simili?

Voglio avere uno spazio non divisibile in TextView.

Risposte:


184

TextViewrispetta il carattere di spazio senza interruzioni Unicode ( \u00A0), che sarebbe una soluzione più semplice / leggera dell'HTML.


3
Funziona benissimo. Puoi aggiungerlo a xml o in codice java. Funziona bene nel codice java, in xml non ho testato molto, ma dovrebbe fare il lavoro.
Mikooos

Né \ u0020 né \ u00A0 funzionano. Né impostandoli in XML (nemmeno nell'anteprima in XML) né impostandoli in Java con setText (). Ho provato entrambi con Android 4.1 e 4.2
Stephan Wiesner

1
Questo non funziona in combinazione con la virgola. In questi casi si ottiene un'interruzione di riga subito dopo la virgola
Alex Bonel

1
\ u00A0 non fa il trucco per me. Non fa spazio, unisce solo le parole - Android 4.4.4, 5.0, 5.1
Marcel Bro

1
A Kotlin funziona molto bene. Sostituisco tutti gli spazi vuoti con questo e rimarrà ellittico dagli ultimi caratteri. str.replace ("", "\ u00A0") restituisce "Hello wor ..." invece di "Hello ..."
Seop Yoon

24

\u00A0è uno spazio unificatore, \u0020non è uno spazio unificatore


24

È possibile utilizzare  per avere una soluzione leggibile. Includere \u00A0o  o  /  nel testo non trasmette molte informazioni al lettore del codice sorgente (o al traduttore per quella materia), a meno che non si ricordino i codici esadecimali. Ecco un modo per utilizzare l'entità denominata in strings.xml:

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

Questo creerà la dichiarazione mancante. La dichiarazione HTML originale può essere trovata in https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent referenziato dai soliti DTD XHTML . Tutto questo funziona, perché il parser XML li legge e li sostituisce durante il caricamento del file, quindi l'entità non sarà presente nelle risorse compilate risultanti.

&nbsp;nelle CharSequencerisorse di testo Android ( )

<!-- 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 e anteprima (l'anteprima non riconosce l'HTML)
HTML sul dispositivo HTML in anteprima

&nbsp; in Android String (formattato) Resources

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

Quindi nel codice:

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

Dispositivo e anteprima (l'anteprima non riconosce le entità e le stringhe Java sono testo letterale!)
formattato sul dispositivo formattato in anteprima

Ulteriori trucchi

Questi sono solo esempi di utilizzo delle entità DTD, usali in base alle tue preferenze.

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

Entrambi aiutano a evidenziare: entità XML evidenziate


Android gestisce il carattere perfettamente, non è necessario creare entità apostrofo. <string name="original">Don’t wrap %1$s</string>funziona come previsto.
Diti

1
@Diti Quello non è un APOSTROFO , è un SEGNO DI CITAZIONE SINGOLA DESTRA ; confrontare 'VS . Android non ha problemi con caratteri Unicode più fantasiosi, ma ha un problema con ASCII 0x27, che necessita di escape. L'entità è solo una comodità, l'ho semplicemente inserita per dimostrare dove potrebbe essere utile.
TWiStErRob

Questo è eccellente =) Grazie. Lo trovo molto più pulito e facile da leggere.
Alex Hart

Ottima risposta, grazie! Sono d'accordo che avere &nbsp;nelle stringhe è molto più significativo per i traduttori rispetto \u00A0
all'unicode

1
@ Sette ovviamente, vedi l'ultima sezione (Ulteriori trucchi) che aggiunge cone param1nello stesso file.
TWiStErRob

18

Il TextView dovrebbe rispettare lo spazio unificatore

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

o

new TextView("Hello\u00A0world");

3

Una situazione unica in cui mi sono imbattuto è stata l'aggiunta di uno spazio unificatore a una risorsa stringa che accettava String.formatparametri.

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

Ho provato semplicemente a copiare e incollare il carattere di spazio unificatore nella stringa ed è stato sostituito con un vecchio spazio normale dopo la compilazione.

Rimuovere formatted = "false" , numerare gli argomenti del formato e utilizzare la notazione backslash ha funzionato per me:

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

2

Questo ha funzionato per me:

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);
}

1

Questo è un esempio dell'utilizzo di nbsp in un TextView

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


4
Dovrebbe essere \ u00A0
poitroae
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.