Eine Stringressource stellt Textstrings für Ihre Anwendung bereit mit optionaler Textstile und ‐formatierung. Es gibt drei Arten von Ressourcen, Ihrer Anwendung mit Zeichenfolgen:
- String
- XML-Ressource, die einen einzelnen String bereitstellt.
- String-Array
- XML-Ressource, die ein Array von Strings bereitstellt.
- Mengenstrings (Plurale)
- XML-Ressource, die verschiedene Strings für die Pluralbildung enthält.
Auf alle Strings können bestimmte Stil-Markup- und Formatierungsargumente angewendet werden. Für Informationen zum Gestalten und Formatieren von Strings finden Sie im Abschnitt Formatierung und Stile.
String
Ein einzelner String, auf den von der Anwendung oder anderen Ressourcendateien verwiesen werden kann (z. B. als XML-Layout.
Hinweis:Ein String ist eine einfache Ressource, auf die verwiesen wird.
Verwenden Sie dazu den im Attribut name
angegebenen Wert (nicht den Namen der XML-Datei). Sie können also
Zeichenfolgenressourcen mit anderen einfachen Ressourcen in der einen XML-Datei kombinieren,
unter einem <resources>
-Element.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dername
des<string>
-Elements wird als Ressourcen-ID.- Datentyp der kompilierten Ressource:
- Ressourcenzeiger auf eine
String
. - Ressourcenreferenz:
-
In Java:
R.string.string_name
In XML:@string/string_name
- Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name" >text_string</string> </resources>
- Elemente:
- Beispiel:
- XML-Datei gespeichert unter
res/values/strings.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources>
Diese Layout-XML wendet einen String auf eine Ansicht an:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />
Dieser Anwendungscode ruft einen String ab:
Sie können entweder
getString(int)
odergetText(int)
, um einen String abzurufen.getText(int)
behält alle Rich-Text-Stile bei, die auf den String angewendet wurden.
String-Array
Ein Array von Strings, auf die in der Anwendung verwiesen werden kann.
Hinweis:Ein String-Array ist eine einfache Ressource, auf die verwiesen wird.
Verwenden Sie dazu den im Attribut name
angegebenen Wert (nicht den Namen der XML-Datei). Als
Sie können Zeichenfolgenarray-Ressourcen mit anderen einfachen Ressourcen in der einen XML-Datei kombinieren.
unter einem <resources>
-Element.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dername
des<string-array>
-Elements wird als Ressourcen-ID.- Datentyp der kompilierten Ressource:
- Ressourcenzeiger auf ein Array aus
String
-Werten. - Ressourcenreferenz:
-
In Java:
R.array.string_array_name
XML:@[package:]array/string_array_name
- Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources>
- Elemente:
- Beispiel:
- XML-Datei gespeichert unter
res/values/strings.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>
Dieser Anwendungscode ruft ein String-Array ab:
Kotlin
val array: Array<String> =
resources
.getStringArray
(R.array.planets_array)Java
Resources res =
getResources()
; String[] planets = res.getStringArray
(R.array.planets_array);
Mengenzeichenfolgen (Pluralformen)
Verschiedene Sprachen haben unterschiedliche Regeln für die grammatische Übereinstimmung mit der Menge. Auf Englisch
Beispiel: Die Menge 1 ist ein Sonderfall. Wir schreiben 1 Buch, aber für jede andere Stückzahl
schreiben Sie „n Bücher“. Diese Unterscheidung zwischen Singular und Plural ist sehr verbreitet, aber andere
und Sprachen feinere Unterscheidungen. Der vollständige von Android unterstützte Satz ist zero
,
one
, two
, few
, many
und other
.
Die Regeln zur Entscheidung, welcher
Fall für eine bestimmte Sprache und Menge
verwendet werden soll, können sehr komplex sein.
Daher bietet Android Ihnen Methoden wie
Zum Auswählen getQuantityString()
die richtige Ressource für Sie.
Früher hießen sie „Mengenstrings“ (und das auch in der API genannt wird),
Strings sollten nur für Pluralformen verwendet werden. Es wäre ein Fehler,
Mengenstrings zu verwenden,
eine Art Gmail-Funktion wie "Posteingang" im Vergleich zu "Posteingang (12)" wenn es ungelesene Nachrichten gibt,
Beispiel. Es mag praktisch erscheinen, Mengenstrings anstelle einer if
-Anweisung zu verwenden,
Es ist jedoch wichtig zu erwähnen, dass diese grammatikalischen Inhalte bei einigen Sprachen (wie etwa Chinesisch) nicht
unterscheiden, sodass Sie immer den String other
erhalten.
Die Auswahl des zu verwendenden Strings beruht ausschließlich auf grammatikalischen Notwendigkeiten.
Im Englischen wird ein String für zero
ignoriert, auch wenn die Menge 0 ist, weil 0
sich grammatikalisch nicht von 2 oder einer anderen Zahl mit Ausnahme von 1 ("null Bücher", "ein Buch",
"zwei Bücher" usw.). Für Koreanisch ist dagegen nur der String other
die jemals von mir verwendet wurden.
Lassen Sie sich auch nicht dadurch täuschen, dass two
beispielsweise nur für
Die Menge 2: Eine Sprache könnte verlangen, dass 2, 12, 102 (und so weiter) alle wie eins behandelt werden.
die sich jedoch von anderen Größen unterscheiden. Verlassen Sie sich darauf, dass Ihr Übersetzer die Unterschiede kennt.
auf denen die Sprache tatsächlich besteht.
Wenn Ihre Nachricht keine Mengennummer enthält, eignet sie sich wahrscheinlich nicht für eine Pluralform. Zum Beispiel wird im Litauisch die Singularform sowohl für 1 als auch für 101 verwendet, also wird „1 Buch“ ist übersetzt als „1 knyga“ und „101 Bücher“ übersetzt als „101 knyga“. In der Zwischenzeit „ein Buch“ ist „knyga“ und „viele Bücher“ ist „daug knygț“. Wenn eine englische Pluralnachricht „ein Buch“ enthält (Singular) und "viele Bücher" (Plural) ohne die tatsächliche Zahl, kann sie mit "knyga" übersetzt werden. (ein Buch)/"daug knygã" (viele Bücher), aber mit Regeln für Litauen, "knyga" wird angezeigt (ein einzelnes Buch), wobei zufällig die Zahl 101 lautet.
Mengenstrings können häufig vermieden werden, indem mengenneutrale Formulierungen verwendet werden, z. B. „Bücher: 1“. Das macht Ihr Leben und die wenn es für eure App akzeptabel ist.
Ab API 24 können Sie die wesentlich leistungsstärkere ICU MessageFormat
verwenden
.
Hinweis: Eine Pluralsammlung ist eine einfache Ressource, die
Verweis auf den Wert im Attribut name
(nicht der Name der XML-Datei)
-Datei). So lassen sich Pluralformen mit anderen einfachen Ressourcen in einem
XML-Datei unter einem <resources>
-Element.
- Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Dername
des<plurals>
-Elements wird als Ressourcen-ID.- Ressourcenreferenz:
-
In Java:
R.plurals.plural_name
- Syntax:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources>
- Elemente:
- Beispiel:
- XML-Datei gespeichert unter
res/values/strings.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <!-- As a developer, you should always supply "one" and "other" strings. Your translators will know which strings are actually needed for their language. Always include %d in "one" because translators will need to use %d for languages where "one" doesn't mean 1 (as explained above). --> <item quantity="one">%d song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources>
XML-Datei gespeichert unter
res/values-pl/strings.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono %d piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources>
Verwendung:
Kotlin
val count = getNumberOfSongsAvailable() val songsFound = resources.
getQuantityString
(R.plurals.numberOfSongsAvailable, count, count)Java
int count = getNumberOfSongsAvailable(); Resources res =
getResources()
; String songsFound = res.getQuantityString
(R.plurals.numberOfSongsAvailable, count, count);Bei Verwendung der Methode
getQuantityString()
müssen Siecount
zweimal übergeben, wenn Ihr String Folgendes enthält: Zeichenfolgenformatierung mit einer Zahl. Für den String%d songs found
auswählt, wird mit dem erstencount
-Parameter der entsprechende Pluralstring ausgewählt und Der zweitecount
-Parameter wird in den Platzhalter%d
eingefügt. Wenn Ihre Pluralform Strings enthalten keine Stringformatierung. Der dritte Parameter muss nicht angetQuantityString
übergeben werden.
Format und Stil
Hier sind ein paar wichtige Dinge, die Sie wissen sollten, Formatieren und gestalten Sie Ihre Stringressourcen.
Umgang mit Sonderzeichen
Wenn ein String Zeichen enthält, die in XML besonders verwendet werden, müssen Sie den Parameter gemäß den standardmäßigen XML/HTML-Escaping-Regeln verwenden. Wenn Sie einem Zeichen Escapezeichen die in Android eine besondere Bedeutung hat, verwenden Sie einen vorangestellten umgekehrten Schrägstrich.
Standardmäßig werden Sequenzen von Leerzeichen in Android zu einem einzelnen Leerzeichen minimiert. Sie können dies vermeiden, indem Sie den relevanten Teil des Strings in doppelte Anführungszeichen setzen. In diesem Fall Alle Leerzeichen (einschließlich neuer Zeilen) werden innerhalb des in Anführungszeichen gesetzten Bereichs beibehalten. Wenn Sie doppelte Anführungszeichen setzen, können Sie auch reguläre einfache Anführungszeichen ohne Escapezeichen verwenden.
Zeichen | Maskierte(s) Formular(e) |
---|---|
@ | \@ |
? | \? |
Neue Zeile | \n |
Tabulatortaste | \t |
U+XXXX Unicode-Zeichen | \uXXXX |
Einfaches Anführungszeichen (' ) |
Eines der folgenden Elemente:
|
Doppeltes Anführungszeichen (" ) |
\"
Beachten Sie, dass es nicht möglich ist, den String in einfache Anführungszeichen zu setzen. |
Leerräume werden ausgeblendet und Android-Escaping erfolgt nach
Ressourcendatei als XML geparst. Das bedeutet, dass
<string>      </string>
(Leerzeichen, Satzzeichen, Unicode-Em-Leerzeichen) werden alle zu einem einzelnen Leerzeichen minimiert.
(" "
), da es sich nach dem Parsen der Datei als XML-Datei ausschließlich um Unicode-Leerbereiche handelt.
Wenn Sie diese Leerzeichen beibehalten möchten, können Sie sie entweder zitieren
(<string>"      "</string>
)
oder Android-Escaping verwenden,
(<string> \u0032 \u8200 \u8195</string>
)
Hinweis:Aus Sicht des XML-Parsers besteht kein Unterschied zwischen
<string>"Test this"</string>
und
<string>"Test this"</string>
. Beide Formen
zeigt keine Anführungszeichen an, sondern löst Anführungszeichen aus, die Android-Leerzeichen beibehalten.
praktischen Effekt).
Strings formatieren
Wenn Sie Ihre Strings formatieren müssen, setzen Sie dazu Ihre Formatargumente in die String-Ressource. wie die folgende Beispielressource zeigt.
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In diesem Beispiel hat der Formatstring zwei Argumente: %1$s
ist ein String und %2$d
eine Dezimalzahl ist. Formatieren Sie dann den String durch Aufrufen von getString(int, Object...)
. Beispiel:
Kotlin
var text = getString(R.string.welcome_messages, username, mailCount)
Java
String text = getString(R.string.welcome_messages, username, mailCount);
Stile mit HTML-Markup
Sie können Ihren Strings mit HTML-Markup Stile hinzufügen. Beispiel:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
Die folgenden HTML-Elemente werden unterstützt:
- Fett: <b>
- Kursiv: <i>, <cite>, <dfn>, <em>
- 25% größerer Text: <big>
- 20% kleinerer Text: <small>
- Für die Schriftart werden die folgenden Einstellungen festgelegt: <font face=”font_family“ color=”hex_color”>. Beispiele für
Mögliche Schriftfamilien sind
monospace
,serif
undsans_serif
- Festbreitenschrift (Monospace-Schriftfamilie): <tt>
- Durchgestrichen: <s>, <strike>, <del>
- Unterstrichen: <u>
- Hochgestellt: <sup>
- Tiefgestellt: <sub>
- Aufzählungspunkte: <ul>, <li>
- Zeilenumbrüche: <br>
- Division: <div>
- CSS-Stil: <span style=”color|background_color|text-decoration”>
- Abschnitte: <p dir=”rtl | ltr” style="...>>
Wenn Sie keine Formatierung anwenden, können Sie TextView-Text direkt festlegen, indem Sie
setText(java.lang.CharSequence)
In einigen Fällen können Sie jedoch
möchten eine Textressource mit benutzerdefiniertem Stil erstellen, die auch als Formatstring verwendet wird. In der Regel
funktioniert nicht, weil format(String, Object...)
und
Mit getString(int, Object...)
-Methoden werden alle Stile entfernt
aus dem String. Die Umgehung dieses Problems besteht darin, die HTML-Tags mit Escape-Zeichen
Entitäten, die dann mit fromHtml(String)
wiederhergestellt werden,
nachdem die Formatierung erfolgt ist. Beispiel:
- Speichern Sie die Textressource mit benutzerdefiniertem Stil als String mit HTML-Escape-Zeichen:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
In diesem formatierten String wird ein
<b>
-Element hinzugefügt. Die öffnende Klammer Mit HTML-Escape-Zeichen unter Verwendung der<
-Notation. - Formatieren Sie den String dann wie gewohnt, aber rufen Sie auch
fromHtml(String)
auf, Konvertieren Sie den HTML-Text in einen formatierten Text:Kotlin
val text: String = getString(R.string.welcome_messages, username, mailCount) val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)
Java
String text = getString(R.string.welcome_messages, username, mailCount); Spanned styledText = Html.fromHtml(text, FROM_HTML_MODE_LEGACY);
Da mit der Methode fromHtml(String)
alle HTML-Entitäten formatiert werden, müssen Sie
alle möglichen HTML-Zeichen in den Zeichenfolgen, die Sie mit dem formatierten Text verwenden, mit
htmlEncode(String)
. Wenn Sie beispielsweise eine Zeichenfolge formatieren, die Zeichen wie
„<“ oder "&" eingeben, müssen sie vor der Formatierung mit Escape-Zeichen maskiert werden, damit bei der
durch fromHtml(String)
übergeben wird, sehen die Zeichen wie gewünscht aus.
die ursprünglich geschrieben wurden. Beispiel:
Kotlin
val escapedUsername: String = TextUtils.htmlEncode
(username)
val text: String = getString(R.string.welcome_messages, escapedUsername, mailCount)
val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)
Java
String escapedUsername = TextUtils.htmlEncode
(username);
String text = getString(R.string.welcome_messages, escapedUsername, mailCount);
Spanned styledText = Html.fromHtml(text);
Stile mit Spannables
Ein Spannable
ist ein Textobjekt, das Sie mit
Schriftbildeigenschaften wie Farbe und Schriftstärke. Sie verwenden
SpannableStringBuilder
zum Erstellen
Ihren Text und wenden Sie dann die in android.text.style
definierten Stile an.
an den Text übergeben.
Mit den folgenden Hilfsmethoden können Sie einen Großteil der Arbeit überspannenden Text erstellen:
Kotlin
/** * Returns a CharSequence that concatenates the specified array of CharSequence * objects and then applies a list of zero or more tags to the entire range. * * @param content an array of character sequences to apply a style to * @param tags the styled span objects to apply to the content * such as android.text.style.StyleSpan */ private fun apply(content: Array<out CharSequence>, vararg tags: Any): CharSequence { return SpannableStringBuilder().apply { openTags(tags) content.forEach { charSequence -> append(charSequence) } closeTags(tags) } } /** * Iterates over an array of tags and applies them to the beginning of the specified * Spannable object so that future text appended to the text will have the styling * applied to it. Do not call this method directly. */ private fun Spannable.openTags(tags: Array<out Any>) { tags.forEach { tag -> setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK) } } /** * "Closes" the specified tags on a Spannable by updating the spans to be * endpoint-exclusive so that future text appended to the end will not take * on the same styling. Do not call this method directly. */ private fun Spannable.closeTags(tags: Array<out Any>) { tags.forEach { tag -> if (length > 0) { setSpan(tag, 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } else { removeSpan(tag) } } }
Java
/** * Returns a CharSequence that concatenates the specified array of CharSequence * objects and then applies a list of zero or more tags to the entire range. * * @param content an array of character sequences to apply a style to * @param tags the styled span objects to apply to the content * such as android.text.style.StyleSpan * */ private static CharSequence applyStyles(CharSequence[] content, Object[] tags) { SpannableStringBuilder text = new SpannableStringBuilder(); openTags(text, tags); for (CharSequence item : content) { text.append(item); } closeTags(text, tags); return text; } /** * Iterates over an array of tags and applies them to the beginning of the specified * Spannable object so that future text appended to the text will have the styling * applied to it. Do not call this method directly. */ private static void openTags(Spannable text, Object[] tags) { for (Object tag : tags) { text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK); } } /** * "Closes" the specified tags on a Spannable by updating the spans to be * endpoint-exclusive so that future text appended to the end will not take * on the same styling. Do not call this method directly. */ private static void closeTags(Spannable text, Object[] tags) { int len = text.length(); for (Object tag : tags) { if (len > 0) { text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { text.removeSpan(tag); } } }
Die folgenden bold
, italic
und color
-Methoden umschließen die oben genannten Hilfsmethoden und zeigen spezifische Beispiele für die
im Paket android.text.style
definierte Stile. Ich
können ähnliche Methoden für andere Arten von Textstilen erstellen.
Kotlin
/** * Returns a CharSequence that applies boldface to the concatenation * of the specified CharSequence objects. */ fun bold(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.BOLD)) /** * Returns a CharSequence that applies italics to the concatenation * of the specified CharSequence objects. */ fun italic(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.ITALIC)) /** * Returns a CharSequence that applies a foreground color to the * concatenation of the specified CharSequence objects. */ fun color(color: Int, vararg content: CharSequence): CharSequence = apply(content, ForegroundColorSpan(color))
Java
/** * Returns a CharSequence that applies boldface to the concatenation * of the specified CharSequence objects. */ public static CharSequence bold(CharSequence... content) { return apply(content, new StyleSpan(Typeface.BOLD)); } /** * Returns a CharSequence that applies italics to the concatenation * of the specified CharSequence objects. */ public static CharSequence italic(CharSequence... content) { return apply(content, new StyleSpan(Typeface.ITALIC)); } /** * Returns a CharSequence that applies a foreground color to the * concatenation of the specified CharSequence objects. */ public static CharSequence color(int color, CharSequence... content) { return apply(content, new ForegroundColorSpan(color)); }
Hier ist ein Beispiel, wie diese Methoden verkettet werden können, um verschiedene Stile auf einzelne Wörter in einer Wortgruppe:
Kotlin
// Create an italic "hello, " a red "world", // and bold the entire sequence. val text: CharSequence = bold(italic(getString(R.string.hello)), color(Color.RED, getString(R.string.world)))
Java
// Create an italic "hello, " a red "world", // and bold the entire sequence. CharSequence text = bold(italic(getString(R.string.hello)), color(Color.RED, getString(R.string.world)));
Das Kotlin-Core-ktx-Modul enthält auch Erweiterungsfunktionen, die die Arbeit mit Spans noch einfacher zu machen. Weitere Informationen finden Sie in der <ph type="x-smartling-placeholder"></ph> android.text-Paketdokumentation auf GitHub.
Weitere Informationen zum Arbeiten mit Spans finden Sie unter den folgenden Links:
- <ph type="x-smartling-placeholder"></ph> Spantastische Textstile mit Spans
- <ph type="x-smartling-placeholder"></ph> Informationen zu Spans
Stile mit Anmerkungen
Sie können komplexe oder benutzerdefinierte Stile anwenden, indem Sie die Annotation
-Klasse zusammen mit dem
<annotation>
-Tag in Ihren Strings.xml-Ressourcendateien. Das Anmerkungs-Tag ermöglicht
Sie können Teile des Strings für benutzerdefinierte Stile markieren, indem Sie benutzerdefinierte Schlüssel/Wert-Paare in der XML-Datei definieren.
das das Framework dann in Annotation
-Spans umwandelt. Diese können Sie dann
Anmerkungen und wenden den Stil mithilfe des Schlüssels und des Werts an.
Beim Erstellen von Anmerkungen musst du <annotation>
hinzufügen.
-Tag zu allen Übersetzungen der Zeichenfolge in jeder Zeichenfolgen.xml-Datei hinzu.
Eine benutzerdefinierte Schriftart auf das Wort „Text“ in allen Sprachen anwenden
Beispiel – Benutzerdefiniertes Schriftbild hinzufügen
-
Fügen Sie das Tag
<annotation>
hinzu und definieren Sie das Schlüssel/Wert-Paar. In diesem Fall Schlüssel ist font und der Wert ist die Art der Schriftart, die wir verwenden möchten: title_emphasis.// values/strings.xml <string name="title">Best practices for <annotation font="title_emphasis">text</annotation> on Android</string> // values-es/strings.xml <string name="title"><annotation font="title_emphasis">Texto</annotation> en Android: mejores prácticas</string>
-
Laden Sie die Stringressource und suchen Sie die Anmerkungen mit dem Schlüssel font. Erstellen Sie dann benutzerdefinierten Span und den vorhandenen ersetzen.
Kotlin
// get the text as SpannedString so we can get the spans attached to the text val titleText = getText(R.string.title) as SpannedString // get all the annotation spans from the text val annotations = titleText.getSpans(0, titleText.length, Annotation::class.java) // create a copy of the title text as a SpannableString. // the constructor copies both the text and the spans. so we can add and remove spans val spannableString = SpannableString(titleText) // iterate through all the annotation spans for (annotation in annotations) { // look for the span with the key font if (annotation.key == "font") { val fontName = annotation.value // check the value associated to the annotation key if (fontName == "title_emphasis") { // create the typeface val typeface = getFontCompat(R.font.permanent_marker) // set the span at the same indices as the annotation spannableString.setSpan(CustomTypefaceSpan(typeface), titleText.getSpanStart(annotation), titleText.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } } } // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan styledText.text = spannableString
Java
// get the text as SpannedString so we can get the spans attached to the text SpannedString titleText = (SpannedString) getText(R.string.title); // get all the annotation spans from the text Annotation[] annotations = titleText.getSpans(0, titleText.length(), Annotation.class); // create a copy of the title text as a SpannableString. // the constructor copies both the text and the spans. so we can add and remove spans SpannableString spannableString = new SpannableString(titleText); // iterate through all the annotation spans for (Annotation annotation: annotations) { // look for the span with the key font if (annotation.getKey().equals("font")) { String fontName = annotation.getValue(); // check the value associated to the annotation key if (fontName.equals("title_emphasis")) { // create the typeface Typeface typeface = ResourcesCompat.getFont(this, R.font.roboto_mono); // set the span at the same indices as the annotation spannableString.setSpan(new CustomTypefaceSpan(typeface), titleText.getSpanStart(annotation), titleText.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan styledText.text = spannableString;
Wenn Sie denselben Text mehrmals verwenden, sollten Sie die Methode SpannableString-Objekt einmalig und verwenden Sie es nach Bedarf wieder, um Leistung und Arbeitsspeicher zu vermeiden. Probleme.
Weitere Beispiele für die Verwendung von Annotationen finden Sie unter <ph type="x-smartling-placeholder"></ph> Internationalisierten Text in Android gestalten
Anmerkungsspannen und Textparzelle
Da Annotation
-Spans ebenfalls ParcelableSpans
sind, ist das Schlüssel/Wert-Paar
Paar- und Paketzustände enthalten. Solange der Empfänger des Pakets weiß, wie es
Anmerkungen, können Sie mit Annotation
-Spans einen benutzerdefinierten Stil auf die
gespitzten Text.
Wenn Sie den benutzerdefinierten Stil beibehalten möchten, wenn Sie den Text an ein Intent-Bundle übergeben, müssen Sie zuerst
Annotation
erstreckt sich bis zu Ihrem Text. Dies können Sie in den XML-Ressourcen über die
<Anmerkung> wie im obigen Beispiel gezeigt. Sie können auch im Code ein neues Tag erstellen,
Annotation
und legen Sie es wie unten gezeigt als Span fest:
Kotlin
val spannableString = SpannableString("My spantastic text") val annotation = Annotation("font", "title_emphasis") spannableString.setSpan(annotation, 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) // start Activity with text with spans val intent = Intent(this, MainActivity::class.java) intent.putExtra(TEXT_EXTRA, spannableString) startActivity(intent)
Java
SpannableString spannableString = new SpannableString("My spantastic text"); Annotation annotation = new Annotation("font", "title_emphasis"); spannableString.setSpan(annotation, 3, 7, 33); // start Activity with text with spans Intent intent = new Intent(this, MainActivity.class); intent.putExtra(TEXT_EXTRA, spannableString); this.startActivity(intent);
Rufen Sie den Text aus dem Bundle
als SpannableString
ab und parsen Sie ihn
die angehängten Anmerkungen, wie im obigen Beispiel gezeigt.
Kotlin
// read text with Spans val intentCharSequence = intent.getCharSequenceExtra(TEXT_EXTRA) as SpannableString
Java
// read text with Spans SpannableString intentCharSequence = (SpannableString)intent.getCharSequenceExtra(TEXT_EXTRA);
Weitere Informationen zu Textstilen finden Sie unter den folgenden Links:
- Google I/O 2018 Talk – Die besten Vorgehensweisen für Textnachrichten auf Android-Geräten
- Verstehen, Spans