Antworten:
TextView
respektiert das Unicode-Leerzeichen ( \u00A0
) ohne Unterbrechung , das eine einfachere / leichtere Lösung als HTML wäre.
\u00A0
ist ein nicht brechender Raum, \u0020
ist kein nicht brechender Raum
Es ist möglich,
eine lesbare Lösung zu haben. Das Einfügen \u00A0
oder  
oder  
/ oder  
in den Text vermittelt dem Leser des Quellcodes (oder dem Übersetzer) nicht wirklich viele Informationen, es sei denn, Sie erinnern sich an die Hex-Codes. Hier ist eine Möglichkeit, die benannte Entität zu verwenden in strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
Dadurch wird die fehlende Deklaration erstellt. Die ursprüngliche HTML- Deklaration finden Sie unter https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent, auf die von den üblichen XHTML-DTDs verwiesen wird . All dies funktioniert, da der XML-Parser diese beim Laden der Datei liest und ersetzt, sodass die Entität in den resultierenden kompilierten Ressourcen nicht vorhanden ist.
in Android Text ( CharSequence
) Ressourcen<!-- 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"
/>
Gerät und Vorschau (Vorschau erkennt HTML nicht)
in Android String (formatiert) Ressourcen<!-- 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"
/>
Dann im Code:
String contents = getString(R.string.formatted_text, "Using an ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
Gerät und Vorschau (Vorschau erkennt keine Entitäten und Java-Zeichenfolgen sind wörtlicher Text!)
Dies sind nur beispielhafte Verwendungen von DTD-Entitäten. Verwenden Sie diese nach Ihren Wünschen.
<!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>
’
Charakter einwandfrei, es müssen keine Apostroph-Entitäten erstellt werden. <string name="original">Don’t wrap %1$s</string>
funktioniert wie erwartet.
'
VS ’
. Android hat keine Probleme mit ausgefalleneren Unicode-Zeichen, aber es hat ein Problem mit ASCII 0x27, das maskiert werden muss. Die Entität ist nur eine Annehmlichkeit, ich habe sie nur dort abgelegt, um zu demonstrieren, wo sie nützlich sein könnte.
das \u00A0
con
und param1
in derselben Datei hinzufügt .
Eine einzigartige Situation, in die ich geriet, war das Hinzufügen eines nicht unterbrechenden Leerzeichens zu einer Zeichenfolgenressource, die String.format
Parameter verwendete.
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
Ich habe versucht, das nicht unterbrechende Leerzeichen einfach zu kopieren und in die Zeichenfolge einzufügen. Nach dem Kompilieren wurde es durch ein normales altes Leerzeichen ersetzt.
Das Entfernen des formatierten = "false" , das Nummerieren der Formatargumente und die Verwendung der Backslash-Notation haben bei mir funktioniert:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Das hat bei mir funktioniert:
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);
}