Risposte:
TextView
rispetta il carattere di spazio senza interruzioni Unicode ( \u00A0
), che sarebbe una soluzione più semplice / leggera dell'HTML.
\u00A0
è uno spazio unificatore, \u0020
non è uno spazio unificatore
È possibile utilizzare
per avere una soluzione leggibile. Includere \u00A0
o  
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 " "><!-- 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.
nelle CharSequence
risorse di testo Android ( )<!-- 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 e anteprima (l'anteprima non riconosce l'HTML)
in Android String (formattato) Resources<!-- 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"
/>
Quindi nel codice:
String contents = getString(R.string.formatted_text, "Using an ");
((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!)
Questi sono solo esempi di utilizzo delle entità DTD, usali in base alle tue preferenze.
<!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>
’
carattere perfettamente, non è necessario creare entità apostrofo. <string name="original">Don’t wrap %1$s</string>
funziona come previsto.
'
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.
nelle stringhe è molto più significativo per i traduttori rispetto \u00A0
con
e param1
nello stesso file.
Una situazione unica in cui mi sono imbattuto è stata l'aggiunta di uno spazio unificatore a una risorsa stringa che accettava String.format
parametri.
<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>
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);
}